根据另一个列表的值对列表进行排序 - Java

FIL*_*IaS 5 java sorting

一个名字列表:(未分类)例如[保罗,犯规,标记]

另一个带整数的列表:例如 [5,2,6]

第二个列表中的值是每个人(名称)"选择"的数字,因此paul的数字为5,犯规的数字为2,标记的数字为6.

我正在尝试根据降序排列的第二个列表的值对名称列表进行排序.我不能使用地图,因为我需要在我的程序上的其他场合使用这两个列表.

通过排序方法,我得到了这样的列表: [paul,mark,foul]

正如你所看到的,它没有像我想要的那样排序.

正确的一个是: [大关,保罗犯规]

但我无法找到代码上的错误.

public ArrayList<String> sortNames(ArrayList<Integer> results){
    String tmp;
    for (int k=0; k<Names.size()-1; k++) {

        boolean isSorted=true;
        for (int i=1; i<Names.size()-k; i++) {

             if (results.get(i)>results.get(i-1)  ) {

                tmp=Names.get(i);
                Names.set(i,Names.get(i-1));
                Names.set(i-1,tmp);

                isSorted=false;
            }
        }
        if (isSorted) break;
    }
    return Names;

}
Run Code Online (Sandbox Code Playgroud)

编辑!!!在下面的答案的帮助下,代码是:

    public ArrayList<String> sortNames(ArrayList<Integer> results){
        String tmp2;
        int tmp;
        for (int k=0; k<Names.size()-1; k++) {

            boolean isSorted=true;
            for (int i=1; i<Names.size()-k; i++) {

                 if (results.get(i)>results.get(i-1)  ) {
                     tmp=results.get(i);
                     results.set(i,results.get(i-1));
                     results.set(i-1,tmp);


                    tmp2=Names.get(i);
                    Names.set(i,Names.get(i-1));
                    Names.set(i-1,tmp2);

                    isSorted=false;
                }
            }
            if (isSorted) break;
        }
    return Names;

}
Run Code Online (Sandbox Code Playgroud)

这段代码工作正常(对于小列表)我只是查询为什么它不适用于像ImageIcon这样的对象.有任何想法吗?

cam*_*ckr 6

摆脱两个列表.如果数据是相关的,那么数据应该一起存储在一个简单的类中.然后将整个类添加到列表中,您可以根据需要对各个属性进行排序.您可以使用Bean Comparator根据需要对此列表进行排序.


maa*_*nus 2

您正在根据列表结果的值对列表名称进行排序...并且它仅因条件而终止k<Names.size()-1。在冒泡排序中通常根本不需要这样的条件,这表明有问题。

您必须交换两个列表中的元素,而不仅仅是名称中的元素。这就是答案,但请注意,冒泡排序是有史以来最糟糕的算法之一。

编辑:

我无法使用地图,因为我的程序中的其他情况下需要这两个列表。

当然可以(假设数字是唯一的):

Map<Integer, String> m = new HashMap<Integer, String>();
for (int i=0; i<results.size(); ++i) m.put(results.get(i), Names.get(i));
Collections.sort(results);
for (int i=0; i<results.size(); ++i) Names.set(i, m.get(results.get(i));
Run Code Online (Sandbox Code Playgroud)

可能会有错误,但思路应该清晰。

还有另一种解决方案,使用一类对(结果,名称),如果您需要的话,它甚至可以使用非唯一的数字。

一个稍微短一点的解决方案:

Map<Integer, String> m = new TreeMap<Integer, String>();
for (int i=0; i<results.size(); ++i) m.put(results.get(i), Names.get(i));
Names.clear();
Names.addAll(m.values());
Run Code Online (Sandbox Code Playgroud)

这是基于TreeSet.values的属性“集合的迭代器按相应键的升序返回值”和List.addAll将指定集合中的所有元素按照它们的顺序附加到此列表的末尾。由指定集合的​​迭代器返回