在ArrayList中查找最出现的字符串

时间:2014-11-13 01:04:20

标签: java arraylist

如果我有这些字符串的ArrayList ......

" String1,String1,String1,String2,String2,String2,String3,String3"

如何在此列表中找到最常出现的字符串?如果有任何重复,我想将两者放在同一个列表中并相应地处理。我怎么能这样做,假设字符串列表可以是任何大小。

这就是我所得到的:

public String getVotedMap() {
        int[] votedMaps = new int[getAvailibleMaps().size()];


        ArrayList<String> mostVoted = new ArrayList<String>();

        int best = 0;

        for(int i = 0; i < votedMaps.length; i++) {
            if(best > i) {
                best = i;
            } else if(best == i) {

            } else {

            }
        }

    }

getAvailibleMaps()是我可以选择的地图列表(同样,可以获得任何大小) 谢谢!

3 个答案:

答案 0 :(得分:2)

使用HashMap

基本理念是将所有值加载到哈希表中。哈希表很好,因为您可以为唯一键分配值。当我们将所有键添加到哈希表时,我们正在检查它是否已经存在。如果是,那么我们增加里面的值。

在我们将所有元素都插入哈希表后,我们逐个浏览哈希表,找到值最大的字符串。整个过程为O(n)

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

for(int i = 0; i < array.length(); i++){
   if(map.get(array[i]) == null){
      map.put(array[i],1);
   }else{
      map.put(array[i], map.get(array[i]) + 1);
   }
}
int largest = 0;
String stringOfLargest;
for (Map.Entry<String, Object> entry : map.entrySet()) {
   String key = entry.getKey();
   int value = entry.getValue();
   if( value > largest){
      largest = value;
      stringOfLargest = key;
   }
}

如果你想要多个largest字符串,而不是仅仅找到最大的字符串并完成。您可以将所有最大的内容添加到可变列表中。

例如:

int largest = 0;
for (Map.Entry<String, Object> entry : map.entrySet()) {
   String key = entry.getKey();
   int value = entry.getValue();
   if( value > largest){
      largest = value;
   }
}
ArrayList<Object> arr = new ArrayList<Object>();
for (Map.Entry<String, Object> entry : map.entrySet()) {
   String key = entry.getKey();
   int value = entry.getValue();
   if( value == largest){
       arr.add(key);
   }
}

arr现在存储所有最常出现的字符串。

此过程仍为O(n)

答案 1 :(得分:0)

只需遍历列表并保留一个HashMap<String,Integer>来计算字符串出现的次数,例如。

Map<String,Integer> counts = new HashMap<String,Integer>();
for(String s : mostVoted) {
    if(counts.containsKey(s)) {
        counts.put(s,counts.get(s)+1);
    } else {
        counts.put(s,1);
    }
}
// get the biggest element from the list
Map.Entry<String,Integer> e = Collections.max(counts.entrySet(),new Comparator<Map.Entry<String,Integer>>() {

        @Override
        public int compare(Map.Entry<String,Integer> o1, Map.Entry<String,Integer> o2) {
            return o1.getValue().compareTo(o2.getValue());
        }

});
System.out.printf("%s appeared most frequently, %d times%n",e.getKey(),e.getValue());

答案 2 :(得分:0)

如果您可以使用java 8,这将为您提供最常见字符串的列表,或者如果列表为空则抛出异常。

List<String> winners = strings.stream()
        .collect(groupingBy(x->x, counting()))  // make a map of string to count
        .entrySet().stream()
        .collect(groupingBy(                    // make it into a sorted map
                Map.Entry::getValue,            // of count to list of strings
                TreeMap::new, 
                mapping(Map.Entry::getKey, toList()))
        ).lastEntry().getValue();