Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何对arraylist进行排序并同时获取索引号_Java_Arraylist - Fatal编程技术网

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);