4

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

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

我想按等级对其进行排序,并且我已经看到很多使用比较器对 2 个并行数组进行排序的示例,但我还没有看到任何对超过 2 个进行排序的示例。

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

4

3 回答 3

10

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

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

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

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

于 2012-11-19T19:37:55.307 回答
3

我认为创建一个新类将是最干净的解决方案。每当您将交换应用到第一个数组(排名)时,您都可以手动实现一个新的排序函数来将交换复制到其他 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);
于 2012-11-19T19:40:18.170 回答
2

额外的课程是必要的吗?不,当然不是。你可以想出一个排序例程来保持一切一致。但是,如果下周您决定需要第 4 个数组,例如发布者,会发生什么情况?现在您的排序程序将不起作用,您必须编写一个新程序。

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

于 2012-11-19T19:51:25.327 回答