2013-05-06 2 views
0

У меня есть этот код для поиска в массиве Array-List, но моя проблема заключается в том, как я могу получить результат из-за этого цикла для целочисленного типа, потому что мне нужно в стороне, может быть, есть другой способ найти с помощью использования для цикла вы можете мне помочь? спасибо ...Как подсчитать повторение слов в списке массивов?

List<String> list = new ArrayList<String>(); 
list.add("aaa"); 
list.add("bbb"); 
list.add("aaa"); 

Set<String> unique = new HashSet<String>(list); 
for (String key : unique) { 
int accurNO = Collections.frequency(list, key); 
    System.out.println(key + ": " accurNO); 
} 
+0

Может быть, температура переменная – Hydroid

ответ

2

Вы должны объявить карту как Map<String, Integer> countMap = new HashMap<String, Integer>(); перед петлей, и заполнить его в цикле.

Map<String, Integer> countMap = new HashMap<String, Integer>(); 
for (String key : unique) { 
    int accurNO = Collections.frequency(list, key); 
    coutMap.put(key, accurNO); 
    //... 
} 
//now you have a map with keys and their frequencies in the list 
1
List<String> list = new ArrayList<String>(); 
list.add("aaa"); 
list.add("bbb"); 
list.add("aaa"); 
Map<String,Integer> countMap = new HashMap(); 

Set<String> unique = new HashSet<String>(list); 
for (String key : unique) { 
    int accurNO = Collections.frequency(list, key); 
    countMap.put(key,accurNO); 
    System.out.println(key + ": " accurNO); 
} 
+0

дорогой правильно, но мне нужно countMap в междунар значение – Freeman

2

Поставь = новый HashSet (список);

и

Collections.frequency (список, ключ);

слишком много накладных расходов.

Вот как я бы это сделать

List<String> list = new ArrayList<String>(); 
list.add("aaa"); 
list.add("bbb"); 
list.add("aaa"); 

Map<String, Integer> countMap = new HashMap<>(); 


for (String word : list) { 
    Integer count = countMap.get(word); 
    if(count == null) { 
     count = 0; 
    } 
    countMap.put(word, (count.intValue()+1)); 
} 

System.out.println(countMap.toString()); 

Выход

{aaa=2, bbb=1} 

EDIT выход один на один: итерации по множеству записей на карте

for(Entry<String, Integer> entry : countMap.entrySet()) { 
    System.out.println("frequency of '" + entry.getKey() + "' is " 
      + entry.getValue()); 
} 

Выход

frequency of 'aaa' is 2 
frequency of 'bbb' is 1 

EDIT 2 Нет необходимости зацикливания

String word = null; 
Integer frequency = null; 

word = "aaa"; 
frequency = countMap.get(word); 
System.out.println("frequency of '" + word + "' is " + 
    (frequency == null ? 0 : frequency.intValue())); 

word = "bbb"; 
frequency = countMap.get(word); 
System.out.println("frequency of '" + word + "' is " + 
    (frequency == null ? 0 : frequency.intValue())); 

word = "foo"; 
frequency = countMap.get(word); 
System.out.println("frequency of '" + word + "' is " + 
    (frequency == null ? 0 : frequency.intValue())); 

Выходной

frequency of 'aaa' is 2 
frequency of 'bbb' is 1 
frequency of 'foo' is 0 

Обратите внимание, что вы всегда будете иметь коллекцию, и вы должны экстракт в считать от него за год так или иначе.

+0

это верно, но вы можете получить отдельно один за другим не как карта – Freeman

+0

@Freeman вы имеете в виду, как ... см. мой EDIT ...? – A4L

+0

дорогой A4L второй код все в порядке, но как я могу получить эти entry.getkey() & entry.getValue() из этого цикла for – Freeman

0

Карта отвечает на работу, но вы можете расширить этот ответ, чтобы решить больше проблем.

Вы создаете класс с необходимыми значениями поля и помещаете класс в список.

import java.util.ArrayList; 
import java.util.List; 

public class WordCount { 

    private String word; 
    private int count; 

    public WordCount(String word) { 
     this.word = word; 
     this.count = 0; 
    } 

    public void addCount() { 
     this.count++; 
    } 

    public String getWord() { 
     return word; 
    } 

    public int getCount() { 
     return count; 
    } 

} 

class AccumulateWords { 
    List<WordCount> list = new ArrayList<WordCount>(); 

    public void run() { 
     list.add(new WordCount("aaa")); 
     list.add(new WordCount("bbb")); 
     list.add(new WordCount("ccc")); 

     // Check for word occurrences here 

     for (WordCount wordCount : list) { 
      int accurNO = wordCount.getCount(); 
      System.out.println(wordCount.getWord() + ": " + accurNO); 
     } 
    } 
} 
0

Я бы выбрал этот список первым, чтобы не перебирать весь список с Collections.frequency каждый раз.Код будет больше, но гораздо более эффективным

List<String> list = new ArrayList<String>(); 
    list.add("aaa"); 
    list.add("bbb"); 
    list.add("aaa"); 
    Map<String, Integer> map = new HashMap<String, Integer>(); 
    Collections.sort(list); 
    String last = null; 
    int n = 0; 
    for (String w : list) { 
     if (w.equals(last)) { 
      n++; 
     } else { 
      if (last != null) { 
       map.put(last, n); 
      } 
      last = w; 
      n = 1; 
     } 
    } 
    map.put(last, n); 
    System.out.println(map); 

выход

{aaa=2, bbb=1} 
Смежные вопросы