我有以下代码。 Collections.Max返回。如何通过System.out.println()显示字符串和整数的值?
public class SortMapOnKeyExample {
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("sultan");
list.add("Masum");
list.add("sultan");
list.add("Sorry");
list.add("sultan");
list.add("Masum");
list.add("sultan");
list.add("Tarek");
list.add("sultan");
Set<String> uniques = new HashSet(list);
Map<String, Integer> counts = new HashMap<String, Integer>();
for (String elem : uniques)
{
counts.put(elem, Collections.frequency(list, elem));
}
Collections.max(counts.entrySet(), new Comparator<Entry<String, Integer>>() {
@Override
public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
return (o1.getValue() - o2.getValue());
}
});
}
}
我已经尝试了很多但是无法知道我该怎么做?请帮助我。此代码的目的是查找最大值发生的字符串及其索引?
答案 0 :(得分:1)
首先,您的代码将在O(n^2)
时间内运行 - 每次调用Collections.frequency
都必须遍历整个数据,并且每个元素都会执行一次。您可以轻松制作此O(n)
:
final Map<String, Integer> counts = new HashMap<>();
for (final String s : list) {
final Integer c = counts.get(s);
if (c == null) {
counts.put(s, 1);
} else {
counts.put(s, c + 1);
}
}
现在请注意,您可以拥有多个具有相同计数的项目。您需要按值排序条目,然后打印顶部的条目:
final List<Entry<String, Integer>> entries = new ArrayList<>(counts.entrySet());
Collections.sort(entries, new Comparator<Entry<String, Integer>>() {
@Override
public int compare(final Entry<String, Integer> o1, final Entry<String, Integer> o2) {
return Integer.compare(o2.getValue(), o1.getValue());
}
});
final MessageFormat format = new MessageFormat("{0} has a count of {1,number,integer}");
final Iterator<Entry<String, Integer>> iter = entries.iterator();
final Entry<String, Integer> first = iter.next();
System.out.println(format.format(new Object[]{first.getKey(), first.getValue()}));
while (iter.hasNext()) {
final Entry<String, Integer> entry = iter.next();
if (entry.getValue() != first.getValue()) {
break;
}
System.out.println(format.format(new Object[]{entry.getKey(), entry.getValue()}));
}
首先,我们从List
的{{1}}创建entrySet()
。接下来我们对Map
进行排序 - 注意比较的逆序 - 这意味着排序是降序而不是升序。另请注意使用List
,这是因为使用Integer.compare
进行比较是非常糟糕的做法,因为如果a - b
很大且a
很大且为负,它会溢出;虽然不是问题,但这并不是一个好习惯。
现在我们将b
作为Iterator
并继续打印元素,直到我们遇到一个不等于(必须小于)第一个元素计数的元素。
输出:
List
对于不同的数据,我们添加{sultan=5, Sorry=1, Tarek=1, Masum=2}
sultan has a count of 5
五次,输出也变为:
Test