我在看的字符串,例如冗余列表
{ "One", "One", "One", "Two", "Three", "Three" }
什么是计数发生的最好办法,然后创建一个字符串的非冗余列表,按出现次数排序 ?
我想结果是这样的名单:
{ "One", "Three", "Two" }
我在看的字符串,例如冗余列表
{ "One", "One", "One", "Two", "Three", "Three" }
什么是计数发生的最好办法,然后创建一个字符串的非冗余列表,按出现次数排序 ?
我想结果是这样的名单:
{ "One", "Three", "Two" }
您可以在这个问题的最投票回答使用的伎俩如何通过自己的价值观地图进行排序 。
下面是一个示例实现(我添加泛型到比较):
public static void main(String[] args) {
String[] strings = {"One", "One", "One", "Two", "Three", "Three"};
//Count occurences
Map<String, Integer> map = new HashMap<String, Integer>();
for (String s : strings) {
if (map.containsKey(s)) {
map.put(s, map.get(s) + 1);
} else {
map.put(s, 1);
}
}
ValueComparator<String, Integer> comparator = new ValueComparator<String, Integer> (map);
Map<String, Integer> sortedMap = new TreeMap<String, Integer> (comparator);
sortedMap.putAll(map);
List<String> sortedList = new ArrayList<String> (sortedMap.keySet());
System.out.println(sortedMap);
System.out.println(sortedList);
}
static class ValueComparator<K, V extends Comparable<V>> implements Comparator<K> {
Map<K, V> map;
public ValueComparator(Map<K, V> base) {
this.map = base;
}
@Override
public int compare(K o1, K o2) {
return map.get(o2).compareTo(map.get(o1));
}
}
它可以快速用Java 8来完成。
Map<String, Long> sortedByCountSet = Stream.of("One", "One", "One", "Two", "Three", "Three")
.collect(Collectors.groupingBy(str->str,TreeMap::new,Collectors.counting()));
System.out.println(sortedByCountSet);
这里输出: -
{一个= 3,三= 2,两个= 1}
要么
Map<String, Long> sortedByCountSet = Stream.of("One", "One", "One", "Two", "Three", "Three","Five","Five")
.collect(Collectors.groupingBy(str->str, Collectors.counting()))
.entrySet().stream().sorted(Comparator.comparing(Map.Entry::getValue))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,(e1, e2) -> e1,LinkedHashMap::new));
输出: -
{两= 1,五= 2,三= 2,一个= 3}
您可以创建一个地图,通过你的列表中,每次你遇到一个新的次数放入列表和设置整数值为1,每次你遇到一个重复的只是一个特定的键增加值。
然后再通过创造从HashMap中的计数的排序列表。
或者,正如其他人使用一个TreeMap可以让你排序,而不是creatign sepearet名单建议。