我有三个ArrayLists
。其中一个Strings
- 名称和两个Integers
- 得分和图片编号。我想通过球员得分(从最高到最低)同时对它们进行排序。现在我使用一个简单的冒泡排序,但我认为Lists
更大时效率不高。
这是我的代码:
public class MyBubbleSort {
public static void bubble_srt(List<Integer> score, List<String> name, List<Integer> pic) {
int n = score.size();
int k;
for (int m = n; m >= 0; m--) {
for (int i = 0; i < n - 1; i++) {
k = i + 1;
if (score.get(i) < score.get(k)) {
swapNumbers(i, k, score, name, pic);
}
}
printNumbers(score);
}
}
private static void swapNumbers(int i, int j, List<Integer> score, List<String> name, List<Integer> pic) {
int temp;
temp = score.get(i);
score.set(i, score.get(j));
score.set(j, temp);
String s;
s = name.get(i);
name.set(i, name.get(j));
name.set(j, s);
int p;
p = pic.get(i);
pic.set(i, pic.get(j));
pic.set(j, p);
}
private static void printNumbers(List<Integer> input) {
for (int i = 0; i < input.size(); i++) {
System.out.print(input.get(i) + ", ");
}
System.out.print("\n");
}
}
谢谢!
答案 0 :(得分:8)
最好的方法是创建一个包含得分,名称和图片属性的类,并拥有该类的一个列表,您可以使用computeLength()
和Collections.sort
对该类进行排序,以比较您班级的两个实例根据得分属性。
与其他排序算法(合并排序,快速排序)相比,冒泡排序效率低,并且不需要自己实现排序算法,因为标准Java包已经为您完成了。
答案 1 :(得分:2)
首先创建一个PlayerInfo
类,如下所示:
package test;
public class PlayerInfo {
private String name;
private Integer score;
private Integer pictureId;
public PlayerInfo(final String name, final Integer score, final Integer pictureId) {
this.name = name;
this.score = score;
this.pictureId = pictureId;
}
public String getName() {
return this.name;
}
public void setName(final String name) {
this.name = name;
}
public Integer getScore() {
return this.score;
}
public void setScore(final Integer score) {
this.score = score;
}
public Integer getPictureId() {
return this.pictureId;
}
public void setPictureId(final Integer pictureId) {
this.pictureId = pictureId;
}
@Override
public String toString() {
return this.name + ":" + this.score + ":" + this.pictureId;
}
}
第二次创建PlayerInfo
Comparator
。在这里,我们创建一个ScoreBasedComparator
(根据您的要求,但您也可以创建其他比较器以满足您的特定需求):
package test;
import java.util.Comparator;
public class ScoreBasedComparator implements Comparator<PlayerInfo> {
@Override
public int compare(final PlayerInfo playerInfo1, final PlayerInfo playerInfo2) {
return playerInfo1.getScore().compareTo(playerInfo2.getScore());
}
}
最后,您可以使用List
对PlayerInfo
个Collections.sort(<your collection>, <your comparator>)
个实例进行排序,如下所示:
package test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class Runner {
public static void main(final String[] args) {
List<PlayerInfo> playerInfos = new ArrayList<PlayerInfo>();
playerInfos.add(new PlayerInfo("A", 123, 1));
playerInfos.add(new PlayerInfo("B", 1, 2));
playerInfos.add(new PlayerInfo("C", 23, 3));
playerInfos.add(new PlayerInfo("D", 300, 4));
Collections.sort(playerInfos, new ScoreBasedComparator());
System.out.println(Arrays.toString(playerInfos.toArray()));
}
}
运行这个小程序将输出以下行:
[B:1:2, C:23:3, A:123:1, D:300:4]
正如您所看到的,您的收藏品在创建时未分类,但按照得分排序打印。
希望这有帮助。
答案 2 :(得分:0)
如果这里的目标是根据其中一个数组对三个数组进行排序,而不是将数组合并到一个公共类中,那么可以创建第四个索引数组,0到size-1,然后是数组索引根据其中一个数组排序(使用内置排序和自定义比较)。然后根据排序索引数组重新排序所有三个数组。我不知道Java是否具有内置的重新排序功能。 C示例根据索引I的排序数组重新排序3个数组A,B,C,时间复杂度为O(n)(线性,每个商店在其中放置一个值的有序位置)。我恢复到0到n-1。
// reorder A,B,C in place according to I
// tA,tB,tC are temps
for(i = 0; i < n; i++){
if(i != I[i]){
tA = A[i];
tB = B[i];
tC = C[i];
k = i;
while(i != (j = I[k])){
A[k] = A[j];
B[k] = B[j];
C[k] = C[j];
I[k] = k;
k = j;
}
A[k] = tA;
B[k] = tB;
C[k] = tC;
I[k] = k;
}
}