2016-04-29 56 views
2

我需要獲取此代碼以接受用戶輸入並告訴我有多少單字母單詞,雙字母單詞,有三個字母的單詞等等。這段代碼編譯,但它只給了我使用最多字母的單詞的次數。例如,如果用戶輸入是「我想知道爲什麼這不起作用」輸出將是一個七個字母的單詞。它並不告訴我使用了多少次所有其他數量的字母單詞。這是隻返回最大的字母詞,當我想要它返回每個字母詞的計數

import java.util.*; 
import java.io.*; 

public class Analysis B { //open class 

    public static String input; 
    public static String stringB; 

    public static void main (String args []) { //open main 


    System.out.println("Please enter a line of text for analysis:"); 

    Scanner sc = new Scanner(System.in); 
    input = sc.nextLine(); 
    input = input.toLowerCase(); 



    System.out.println("Analysis B:");//Analysis B 
    System.out.println("Word length: " + "   Frequency: "); 
    System.out.println(AnalysisB(stringB)); 




    } // close main 




    public static String AnalysisB (String stringB) { // open analysis B 

     String [] words = input.split(" "); 

     int largest = 0; 

     for (int i = 0; i < words.length; i++) { //open for 
      largest = Math.max(words[i].length(), largest); // get the largest value 
     } //close for 

     int [] frequencies = new int[ largest + 1 ]; 

     for (int i = 0; i < words.length; i++) { //open for 
     frequencies[words[i].length()]++; 
     } //close for 

     for (int i = 0; i < frequencies.length; i++) { //open for 
     if (frequencies[i] > 0) { //open if 
     stringB =(i + "-letter words" + "    " + frequencies[i]); 
     } //close if 
     } //close for 

    return stringB; 

    } // close analysis B 





} //close class 

回答

0

這是你的問題:

stringB =(i + "-letter words" + "    " + frequencies[i]); 

每一這行代碼運行的時候,一個新的值賦給stringB,在寫作之前的值。相反,你希望它看起來是這樣的:

stringB += (i + "-letter words" + "    " + frequencies[i] + "\n"); 

+=運營商將增加stringB而不是替換它(和"\n"將確保其添加到每次一個新行)。

順便說一句,沒有必要導入java.io.*,因爲它沒有在你的程序中使用。 java.io涉及文件操作。

0

這裏是一種帶有排序的HashMap(TreeMap中)做到這一點:

public static void AnalysisB (String input) 
{ 
    String [] words = input.split(" "); 

    Map<Integer, Integer> map = new TreeMap<Integer, Integer>(); 

    for (String w : words) 
    { 
     int len = w.length(); 

     Integer freq = map.get(len); 
     if (freq == null) 
     { 
      map.put(len, 1); 
     } 
     else 
     { 
      map.put(len, freq + 1); 
     } 
    } 

    for (Iterator<Integer> iter = map.keySet().iterator(); iter.hasNext();) 
    { 
     int len = iter.next(); 
     System.out.println(len + "-letter words" + "    " + map.get(len)); 
    } 
} 

注意:我提出的方法無效,因爲你是剛剛打印出的方法的頻率。

0

試試這個。

public static String AnalysisB (String stringB) { 
    return Stream.of(stringB.split(" ")) 
     .map(s -> s.length()) 
     .collect(Collectors.groupingBy(n -> n, Collectors.counting())) 
     .entrySet().stream() 
     .sorted(Comparator.comparing(e -> e.getKey())) 
     .map(e -> e.getKey() + "-letter words   " + e.getValue()) 
     .collect(Collectors.joining("\n")); 
} 

System.out.println(AnalysisB("I want to know why this is not working")); 

結果:

1-letter words   1 
2-letter words   2 
3-letter words   2 
4-letter words   3 
7-letter words   1