2012-05-17 4 views
1

Где я могу отредактировать этот код, чтобы найти первую букву каждого слова из моего входного файла, сохраняя частоту и процент, а не каждый символ? например где я могу реализовать charAt(0) или что мне нужно изменить/добавить?Как найти первую букву в каждом слове?

import java.util.Scanner; 
import java.io.File; 
import java.io.FileNotFoundException; 

public class FirstWordLetters 
{ 
    public static void main(String[] args) throws FileNotFoundException 
    { 
     char[] capital = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J','K', 'L', 'M', 'N', 
       'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'}; 

     char[] small = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 
       'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' }; 


     //Input Scanner into the system   
     Scanner scan; 
     //2. Locate file using the scanner class - search to computer data location 
     try { 
      scan = new Scanner(new File("F:/programming principles/Programming Principles - PART B/enciphered.txt")); 
     } catch (Exception e) { //throw exception e (meaning prevent any runtime errors) 
      System.out.println("File not found"); 
      return; 
     } 
     //3. Set up int's (to count, and for the complete count.) 
     //the aplhabet has 26 characters so the new int will be 26. The mem. space of the array. 
     int[] count = new int[26]; 
     int completeTotal = 0; 
     //4. Start scanning the system 
     //Scan every line and notify user that each line has been read properly. 
     //each time line has been read store value in array and increment by one 
     while(scan.hasNextLine()) { 
      String line = scan.nextLine(); 
      System.out.println("Line read: " + line); 
      char[] digit = line.toCharArray(); 
      for(int i = 0; i < digit.length; i++) { 
       for(int j = 0; j < 26; j++) { 

        if(digit[i] == capital[j] || digit[i] == small[j]) { 
         count[j]++; 
         completeTotal = completeTotal + 1; 
         break; 
        } 
       } 
      } 
     } 
     //5. Display results 
     //Print the overall data - letter, frequency and percentage. 
     System.out.println(""); 
     System.out.println("First Word Count"); //notify user of what has been counted? (full count) 
     for (int i = 0; i < 26; i++) //increment each letter frequency by one each time 
     { 
      System.out.print(" " + small[i]); 
      System.out.print(" " + count[i]); 
      //calculate and display percentage for the full count 
      if (count[i] > 0) 
       System.out.println(" " + (((float) count[i]/completeTotal)*100) + "%"); 
      else 
       System.out.println(" 0%"); 

     } 
    }  
} //end of source code. 
+0

Можете ли вы разместить свои входные данные и выходные данные, которые вы хотите получить от него? Мне не совсем понятно, что вы хотите здесь сделать. – Tharwen

+0

done :) @Tharwen – Kieran

+0

Вы удалили все это ... Я все равно посмотрю – Tharwen

ответ

2

Этот код будет делать это. inputString - это весь ваш файл, хранящийся в виде одной строки. Также обратите внимание, что, если какое-либо слово начинается с не-алфавитного символа, он сработает. Кроме того, предполагается, что каждое отдельное слово разделяется пробелом или новой строкой.

int[] charCounts = new int[26]; 

    //Separate the string into individual words 
    //The string " /n" tells it to look for spaces and newline characters "/n" 
    StringTokenizer st = new StringTokenizer(inputString, " /n"); 

    //Loop until all the words are processed 
    while (st.hasMoreTokens()) { 

     //Select the next word 
     String word = st.nextToken(); 

     //Convert the string to upper case so that lower case and upper case characters are represented the same 
     word = word.toUpperCase(); 

     //Get the first character from the word 
     char firstChar = word.charAt(0); 

     //Convert the character to an integer representing it as an ASCII code 
     int charCode = (int) firstChar; 

     //Increment the count for that character by 1 
     //(We subtract 65 from the ASCII code because the array starts at 0 but 'A' is at 65) 
     charCounts[charCode - 65]++; 
    } 

    //Obviously replace this section with whatever you like. It's just to show you how to get the values out again. 
    for (int i = 0; i < charCounts.length; i++){ 
     System.out.println((char)(i + 65) + ": " + charCounts[i]); 
    } 

Для строки "asduhasa ioajsdu ijqwjfoscn kopeurfc eqiwdfjs/nijoasdij iohwefscd aosd8ch", это выводит:

A: 2 
B: 0 
C: 0 
D: 0 
E: 1 
F: 0 
G: 0 
H: 0 
I: 4 
J: 0 
K: 1 
L: 0 
M: 0 
N: 0 
O: 0 
P: 0 
Q: 0 
R: 0 
S: 0 
T: 0 
U: 0 
V: 0 
W: 0 
X: 0 
Y: 0 
Z: 0 

Если есть что-то вы не понимаете, я сделаю все возможное, чтобы объяснить ,

+0

отличная помощь^очень благодарен. Престижность вам, сэр. – Kieran

0

Просто чрезмерное использование подстроки()

Или вы можете использовать Шар()

+0

могли бы вы дайте мне пример того, где я буду использовать подстроку в коде? – Kieran

+0

Да, CharAt (0) был тем, о чем я думал, но я не уверен, куда его поместить в код для его работы ... – Kieran

+0

Это очень просто. Вы берете String (который я предполагаю, это то, с чем вы работаете), а затем вызывайте подстроку. String s = "Lol"; s.substring (0,1); <- Первая буква. – OmniOwl

1

Как об использовании регулярных выражений? Вот пример.

String line = scan.nextLine(); 
System.out.println("Line read: " + line); 
for(String s : line.split("\\s+")) { 
    System.out.println(s.charAt(0)); 
    break; 
} 
+0

У меня очень мало понимания по регулярному выражению. конечно, есть место в коде, где я мог бы использовать charAt (0) или что-то еще при чтении строки за строкой и массивами? – Kieran

+0

Код, который я поставил выше, взят из фрагмента кода в вопросе. Я просто добавил выражение регулярного выражения. Поскольку вам нужна первая буква слова, код должен быть выделен двумя словами либо через токенизатор, либо в регулярное выражение. Что касается чтения массива, я лично думаю, что мы можем использовать карту или хеш-таблицу, которую мы можем узнать из подсчета и процента. – user1401472

Смежные вопросы