繁体   English   中英

如何排序3个并行数组?

[英]How to sort 3 parallel arrays?

我目前有3个信息数组,不知道如何根据其中一个值对它们进行排序:

int[] rank = { 1, 3, 4, 2, 5 };
String[] game = { "Snake", "Mines", "Fragged", "Siege", "Tower" };
int[] year = { 1980, 1983, 1981, 1995, 1992 };

我想按排名对它进行排序,我已经看到很多人使用比较器对2个并行数组进行排序的例子,但我没有看到任何排序超过2的例子。

我的第一个想法是为每个创建一个带有变量的类,然后对该对象进行排序,但是对于排序来说真的是一个额外的类吗?

我的第一个想法是为每个创建一个带有变量的类,然后对该对象进行排序,但是对于排序来说真的是一个额外的类吗?

这不是绝对必要的 - 如果你真的想要,你绝对可以编写一些代码来避免它。 但是,我认为这是一件非常好的事情

这里没有三个单独的项目集合:您有一个项目集合,每个项目都有三个属性。 所以让你的代码匹配。 每当你发现你有并行集合,这样a[0]b[0]相关时就与c[0]等有关,你应该考虑将这些信息封装在一个单独的类中。 它将使您的代码易于维护,并实现更高的一致性。

例如,那些数组具有不同的长度是没有意义的:但是声明中没有任何内在的东西可以阻止它。 如果您有一个集合,则不可能为不同的属性提供不同数量的项目,正是因为您有一个集合。

我认为创建一个新类将是最干净的解决方案。 您可以手动实现一个新的排序函数,以便在将交换应用于第一个数组(排名)时将交换复制到其他2个数组,但这会很快变得混乱。

您需要的就是以下内容:

public class Game implements Comparable<Game>{
    private int rank = 0;
    private int year = 0;
    private String name = "";
    ...
    // Constructor +
    // Usual getters and setters here
    ..
    public int compareTo(Game anotherGame) {
       return this.rank - anotherGame.getRank();
    }
}

然后你可以简单地做:

List<Game> games = new ArrayList<Game>();
...
// Add some games to your games list
...
Collections.sort(games);

额外课程是否必要? 好吧不,当然不是。 你可以想出一个可以保持一致性的排序程序。 但是,如果您下周决定需要第4个阵列(例如发布者),会发生什么? 现在你的排序程序不起作用,你必须写一个新的。

如果你改为编写一个类来保存这些字段作为属性,你可以极大地简化排序逻辑,而且你只需要担心一个数组。 您现在所做的任何额外工作都将很快得到补偿,然后您必须维护此代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM