【问题标题】:How to sort 3 parallel arrays?如何对 3 个并行数组进行排序?
【发布时间】:2012-11-19 19:36:02
【问题描述】:

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

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

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

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

【问题讨论】:

  • 是的。是的,额外的课程是必要的。 (但人们总是高估额外课程在代码、工作量等方面的实际“成本”)
  • 问题是,真的需要 3 个数组吗?
  • 您不喜欢使用对象还是索引?

标签: java sorting collections


【解决方案1】:

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

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

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

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

【讨论】:

  • 似乎每个人都在此页面上。感谢您澄清并强调保持代码可维护性
【解决方案2】:

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

【讨论】:

  • 谢谢你提供的好例子,它看起来是一个很好的简单干净的方式来编写类,我可能会这样做。
【解决方案3】:

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

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

【讨论】:

  • 您的第一段确实有助于理解为什么最好的选择是编写额外的课程。从长远来看,编写额外的课程绝对是有益的。
猜你喜欢
  • 1970-01-01
  • 2016-07-26
  • 2011-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多