Java 如何对arraylist进行排序并同时获取索引号
我对这些元素进行反向排序,我希望在同一时间按索引进行相同的排序 像Java 如何对arraylist进行排序并同时获取索引号,java,arraylist,Java,Arraylist,我对这些元素进行反向排序,我希望在同一时间按索引进行相同的排序 像s1.deposit.get(0)=100排序后索引号将是2,我想要Tom,它在开始时是索引号0,得到2。我该怎么做 s1.deposit.add(100); s1.deposit.add(75); s1.deposit.add(1890); s1.deposit.add(25); s1.deposit.add(360); acc.named.add("Tom"); acc.named.add("John"); acc.name
s1.deposit.get(0)=100
排序后索引号将是2,我想要Tom,它在开始时是索引号0,得到2。我该怎么做
s1.deposit.add(100);
s1.deposit.add(75);
s1.deposit.add(1890);
s1.deposit.add(25);
s1.deposit.add(360);
acc.named.add("Tom");
acc.named.add("John");
acc.named.add("Elena");
acc.named.add("Ralph");
acc.named.add("Carl");
Collections.sort(s1.deposit, Collections.reverseOrder());
int i = 0;
for(int counter: s1.deposit)
System.out.println(counter + " "+ acc.named.get(i));
i++;
}
最好的解决方案是有一个名为
的列表,而不是两个单独的列表s1.存款和账户名为。Person
类可以如下所示:
public class Person {
private String name;
private int deposit;
// TODO: constructor accepting both fields, getters and setters
}
和人员名单:
List<Person> people = new ArrayList<>();
people.add(new Person("Tom", 100));
people.add(new Person("John", 75));
people.add(new Person("Elena", 1890));
people.add(new Person("Ralph", 25));
people.add(new Person("Carl", 360));
但是,如果创建类(如Person
)不是一个选项,您仍然可以在a的帮助下完成所需的操作,a按键对条目进行排序:
Map<Integer, List<Integer>> indicesMap =
new TreeMap<>(Comparator.naturalOrder().reversed());
for (int i = 0; i < s1.deposit.size(); i++) {
Integer deposit = s1.deposit.get(i);
indicesMap.computeIfAbsent(deposit, k -> new ArrayList<>()).add(i);
}
我正在流化映射的值(即列表),然后使用该方法将列表流按顺序展平为包含所有列表元素的流。然后,我通过该方法将这些索引从acc.names
列表转换为相应的名称,并最终打印它们。如果您希望两个列表在排序时具有相同的排序顺序,典型的解决方案是将两个列表中的对象合并为一个对象,并使用比较器对排序后的部分进行排序。请说明需要完成的任务。使用两个单独的列表是要求还是您个人的决定?@RC。也许这个问题有点不清楚,但在我读了两分钟后,我明白了要求是什么。自始至终,我注意到SO社区的一些成员对海报持一种不愉快、迂腐的态度。我认为在这个社区,我们应该以帮助他人的意愿为动力,即使是在问题不明确的情况下(这里不是这样)。有时,我甚至注意到一种粗鲁的态度,这种态度一点也不友善,尤其是对新海报。@Federicoperaltachaffner如果你理解这个问题,那对你有好处。如果你认为我的第一条评论是粗鲁或不友善的,那么就把它标出来,否则就别读了。。
Map<Integer, List<Integer>> indicesMap =
new TreeMap<>(Comparator.naturalOrder().reversed());
for (int i = 0; i < s1.deposit.size(); i++) {
Integer deposit = s1.deposit.get(i);
indicesMap.computeIfAbsent(deposit, k -> new ArrayList<>()).add(i);
}
indicesMap.values().stream()
.flatMap(Collection::stream)
.map(acc.names::get)
.forEachOrdered(System.out::println);