如果我有这些字符串的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()是我可以选择的地图列表(同样,可以获得任何大小) 谢谢!
答案 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();