一个名字列表:(未分类)例如[保罗,犯规,标记]
另一个带整数的列表:例如 [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这样的对象.有任何想法吗?
您正在根据列表结果的值对列表名称进行排序...并且它仅因条件而终止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 “将指定集合中的所有元素按照它们的顺序附加到此列表的末尾。由指定集合的迭代器返回“