如何对数组排序而不丢失对thingy索引的引用?

时间:2019-05-06 01:49:05

标签: java arrays sorting

好的。我实际上是编码的初学者(参加了一些课程,但学习者缓慢/密集),答案可能非常简单。我有一个具有名称的字符串数组,另一个具有相关的分数。

names[0] = blinky   
scores[0] = 42 (blinky's score)   
names[1] = inky   
scores[1] = 37 (inky's score)  

在for循环中,我调用数字(索引号?我对术语感到恐惧。似乎唯一有意义的事情就是代码本身)。无论如何,我希望能够保留i。

我想创建一个列表,按名称从高到低的顺序排列分数。

我不知道使用util.Arrays或将自动排序的任何方法是否会有所帮助。我相信我必须手动对它们进行排序才能保持名称和数字对齐

//Example  
String[] names = {"Blinky","Inky","Pinky","Clyde"};  
int[] scores = {42,37,67,50};  

for (int = 0; i < scores.length; i++){  
System.out.println("what do?")  
}

我将如何制作一个将名称排序的列表?越简单越好。 我非常感谢您的帮助。

编辑:非常感谢大家的帮助! :)

2 个答案:

答案 0 :(得分:0)

要获得以下结果,您可以尝试以下代码。

Unsorted
---------
Blinky, score=42
Inky, score=37
Pinky, score=67
Clyde, score=50
sort by score ascending
Inky, score=37
Blinky, score=42
Clyde, score=50
Pinky, score=67 
sort by Name ascending 
Blinky, score=42
Clyde, score=50
Inky, score=37
Pinky, score=67

1)创建一个名为NameScoreEntity的新类,将两个变量存储在一起(这样,当您进行排序时,名称和分数将同时完成)

public class NameScoreEntity {
    String name;
    int score;

    public NameScoreEntity(String name, int score) {
        this.name = name;
        this.score = score;
    }

    @Override
    public String toString() {
        return name + ", score=" + score;
    }
}

2)然后创建新类的arrayList,将两个数组复制到其中。

    String[] names = {"Blinky","Inky","Pinky","Clyde"};
    int[] scores = {42,37,67,50};

    List<NameScoreEntity> data = new ArrayList<>(); // your data is now stored here

    for (int i= 0; i < scores.length; i++){
        data.add(new NameScoreEntity(names[i], scores[i]));
    }
    //print unsorted
    System.out.println("Unsorted\n---------");
    for (NameScoreEntity e : data) {
        System.out.println(e);
    }

3)最后,您只需使用列表中可用的sort()方法进行排序即可。

    System.out.println("sort by score ascending");
    data.sort(new Comparator<NameScoreEntity>() {
        @Override
        public int compare(NameScoreEntity o1, NameScoreEntity o2) {
            return Integer.compare(o1.score, o2.score); //for descending just swap o1 & o2
        }
    });
    for (NameScoreEntity e : data) {
        System.out.println(e);
    }

    System.out.println("sort by Name ascending");
    data.sort(new Comparator<NameScoreEntity>() {
        @Override
        public int compare(NameScoreEntity o1, NameScoreEntity o2) {
            return o1.name.compareTo(o2.name) ;//for descending just swap o1 & o2
        }
    });
    for (NameScoreEntity e : data) {
        System.out.println(e);
    }

答案 1 :(得分:-1)

您应该使用TreeMap,它将始终保持得分之间的顺序并与相应的String相匹配。

// new TreeMap that sorts from highest to lowest
Map<Integer, String> map = new TreeMap<>(Collections.reverseOrder());

然后使用已存在的循环将所有值put放入Map

for(int i = 0; i < scores.length; i++)
        map.put(scores[i], names[i]);

最后您可以只打印Map

System.out.println(map);

结果:

  

{67 =粉红,5​​0 =克莱德,42 =闪烁,37 =漆黑}