问题如下:简有朋友,她与一个号码联系在一起。我必须把最少喜欢的朋友输出到最喜欢的朋友。
我主要的好奇心是如何在输出时反转地图值的顺序。
在我的代码中,我必须通过Iterator
(我无法直接使用Collection)提取值,然后通过在索引0处插入每个连续元素将每个String存储到ArrayList
中。结果,颠倒了我认为有效的顺序。
import java.util.*;
import java.io.*;
import static java.lang.System.*;
public class Friends {
public static void main(String args[]) throws IOException
{
Scanner line = new Scanner(new File("friends.dat"));
int trials = line.nextInt();
for(int k = 0 ; k < trials ; k++)
{
TreeMap<Integer, String> m = new TreeMap<Integer,String>();
int subtrials = line.nextInt();
for(int a = 0; a < subtrials ; a++)
{
String name = line.next();
int likes = line.nextInt();
m.put(likes,name);
}
Iterator iter = m.values().iterator(); //**Code of interest starts here**
ArrayList<String> list = new ArrayList<String>();
while(iter.hasNext()) {
list.add(0, (String)iter.next());
}
for(int a = 0 ; a < list.size() ; a++)
{
if(a == list.size() - 1)
out.print(list.get(a));
else
out.print(list.get(a) + ", ");
}
out.println();
}
}
}
答案 0 :(得分:2)
您可以使用自定义comparator来反转地图中条目的顺序(请注意,这仅适用于TreeMap - 其他地图实施并不关心订购)。
public static void main(String[] args) {
TreeMap<Integer, String> map = new TreeMap<>((key1, key2) -> Integer.compare(key2, key1)); //Custom comparator.
map.put(1, "Bob");
map.put(3, "Baz");
map.put(2, "Foo");
System.out.println(map);
}
答案 1 :(得分:1)
使用喜欢的数量作为关键字似乎很奇怪,因为多个朋友可能拥有相同数量的喜欢。
在Java 8中,我将执行以下操作:
Map<String, Integer> map = new HashMap<>();
map.put("Jack", 7);
map.put("Jill", 3);
map.put("John", 12);
map.entrySet()
.stream()
.sorted(Map.Entry.comparingByValue((a, b) -> b.compareTo(a)))
.forEach(System.out::println);
基本上,这会将地图条目转换为流,使用反转自然顺序的比较器按值比较它们,然后打印出每个条目。
结果是:
John=12
Jack=7
Jill=3
答案 2 :(得分:0)
请试试这个:
m.forEach((a,b)->System.out.print(b+", "));
这将为您提供一个有序的地图,从最喜欢的喜欢到喜欢。 如果你想要一个从最喜欢到最少喜欢的有序地图,你可以这样做:
TreeMap<Integer, String> m = new TreeMap<Integer,String>(Collections.reverseOrder());
答案 3 :(得分:-1)
您可以简单地reverse列表。
list.reverse();
或者,您可以将TreeMap constructor与反向比较器一起使用,以按降序存储地图。
... = new TreeMap<>(Collections.reverseOrder(Integer::compare));