有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

安卓在Java中,同时对三个ArrayList进行排序最有效的方法是什么

我有三个。一个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");
    }

}

谢谢


共 (3) 个答案

  1. # 1 楼答案

    最好的方法是创建一个包含score、name和pic属性的类,并拥有该类的单个列表,您可以使用Collections.sort和一个Comparator进行排序,该列表根据score属性比较类的两个实例

    与其他排序算法(合并排序、快速排序)相比,冒泡排序效率更高,而且不需要自己实现排序算法,因为标准Java包已经为您实现了这一点

  2. # 2 楼答案

    如果此处的目标是根据其中一个数组对三个数组进行排序,而无需将数组组合到一个公共类中,则可以创建第四个索引数组0到size-1,然后根据其中一个数组对索引数组进行排序(使用内置排序和自定义比较)。然后根据已排序索引的数组对所有三个数组重新排序。我不知道Java是否有内置的重新排序功能。例如,根据索引I的排序数组对3个数组A、B、C重新排序,时间复杂度为O(n)(线性,每个存储在其排序位置放置一个值)。I被恢复为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;
            }
        }
    
  3. # 3 楼答案

    首先创建一个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{}。这里我们创建一个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());
        }
    
    }
    

    最后,您可以使用Collections.sort(<your collection>, <your comparator>)ListPlayerInfo实例进行排序,如下所示:

    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]
    

    正如您所见,您的收藏在创建时未排序,但按分数排序打印

    希望这有帮助