2014-12-19 4 views
0

Я делаю программу, чтобы подсчитать длину каждого слова, а затем количество вхождений этой длины.Считайте длину слова с появлением

Например:

Enter a String :I love my work 
The word count is - 
No. of words of length 1 are 1. 
No. of words of length 2 are 1. 
No. of words of length 4 are 2. 

До сих пор я попытался это,

import java.util.Scanner; 

class Demo{ 
    public static void main(String[] args){ 
     String s; 
     Scanner sc=new Scanner(System.in); 
     System.out.print("Enter a String :"); 
     s=sc.nextLine(); 
     String[] arr = s.split(" "); 
     String str = ""; 
     int [] len = new int[arr.length]; 
     int [] count = new int[arr.length]; 
     int c = 0; 
     for(int i=0;i<arr.length;i++){ 
      str = arr[i]; 
      len[i] = str.length(); 

      for(int j=0;j<arr.length;j++){ 
       if(str.length() == arr[j].length()){ 
        count[i] = ++c; 
       } 
      } 
      c = 0; 
     } 

     for(int i=0;i<len.length;i++){ 

      System.out.println("No. of words of length "+len[i]+" are "+count[i]+"."); 

     } 

    } 
} 

Существует проблема в моей логике, и именно поэтому его вывод таков:

Enter a String :I love my work 
    The word count is - 
    No. of words of length 1 are 1. 
    No. of words of length 2 are 1. 
    No. of words of length 4 are 2. 
    No. of words of length 4 are 2. 

Любое предложение, как исправить это или любой другой более простой способ сделать это (без использования коллекций, карт).

+3

Прежде всего, вы должны использовать HashMap для хранения счетчиков. Карта <"число, которое вы считаете", "количество вхождений"> является стандартным способом его решения. –

+1

Вы получите избыточный выход для каждого слова одинаковой длины. Используйте карту, как указал Марцин. –

ответ

2

Вы можете заменить array на Map<Integer,Integer>, он будет easiar.

Scanner sc = new Scanner(System.in); 
    System.out.print("Enter a String :"); 
    String s = sc.nextLine(); 
    String[] arr = s.split(" ");// get the words 
    Map<Integer, Integer> lengthVsCount=new HashMap<>(); // length vs count 
    for(String i:arr){ // iterate array 
     Integer val=lengthVsCount.get(i.length()); // searching count 
     if(val!=null){ // if count is there 
      lengthVsCount.put(i.length(),val+1);// increment count by one 
     }else{ // count not there 
      lengthVsCount.put(i.length(),1); // add count as one 
     } 
    } 
    for (Map.Entry<Integer,Integer> entry:lengthVsCount.entrySet()) { 
     System.out.println("No. of words of length " + entry.getKey() + " are " + entry.getValue() + "."); 
    } 
+0

недоверчивый вопрос ... не используя карту или коллекции ... прилипание к строкам, массивам – Leo

1

Вы должны использовать карту:

public static void main(String[] args) { 
    final String input = "I love my work"; 
    final String[] words = input.split(" "); 
    final Map<Integer, Integer> occurencesMap = new HashMap<Integer, Integer>(); 
    for (final String word : words) { 
     final int lenght = word.length(); 
     if (occurencesMap.get(lenght) == null) { 
      occurencesMap.put(lenght, 1); 
     } else { 
      occurencesMap.put(lenght, occurencesMap.get(lenght) + 1); 
     } 
    } 
    System.out.println("The word count is -"); 
    final Iterator<Map.Entry<Integer, Integer>> entries = occurencesMap.entrySet().iterator(); 
    while (entries.hasNext()) { 
     final Map.Entry<Integer, Integer> entry = entries.next(); 
     System.out.println("No. of words of length " + entry.getKey() + " are " + entry.getValue()); 
    } 
} 
+0

недооцениваемый вопрос ... не используя карту или коллекции ... придерживаясь строки, массивов – Leo

+0

@ Leo, но почему? проще и лучше использовать карты в этом случае – MihaiC

+0

да, знаю, что @MihaiC ... но это вызов. – Leo

0
class Demo{ 
    public static void main(String[] args){ 
    String s; 
    Scanner sc=new Scanner(System.in); 
    System.out.print("Enter a String :"); 
    s=sc.nextLine(); 
    HashMap<Integer, Integer> map = new HashMap<Integer, Integer>(); 

    for (String str : s.split(" ")) { 
     int key = str.length(); 
     if (map.containsKey(key)) { 
      map.put(key, map.get(key)+1); 
     } 
     else { 
      map.put(key, 1); 
     } 
    } 

    Iterator<Integer> iterator = map.keySet().iterator(); 
    while(iterator.hasNext()) { 
     int key = iterator.next(); 
     System.out.println("No. of words of length " + key + " are " + map.get(key) + "."); 
    } 

    } 
} 
+0

Вы заметили, что это третий ответ, который использует Maps и OP, заметил, что он не будет/не может использовать карты? – Tom

0

Здесь

for(int i=0;i<arr.length;i++){ 
    str = arr[i]; 
    len[i] = str.length(); 

Вы должны проверить, если len[i] не является значением уже в массиве. Так что используйте

int k; 
for(k=0 ; k<i ; k++) 
    if(len[i]==len[k]) //if a match was found 
     break; //break out of the loop 
if(k!=i) //will be true if the break has been executed 
{ 
    len[i]=0; //set to 0 
    continue; //go back to the loop 
} 

Только после этого и использовать

for(int i=0;i<len.length;i++){ 
    if(len[i]!=0) 
    System.out.println("No. of words of length "+len[i]+" are "+count[i]+"."); 
} 

При печати результатов.

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