【问题标题】:Sort 2D Array in java在java中对二维数组进行排序
【发布时间】:2013-05-26 08:35:23
【问题描述】:

编辑:我尝试使用camparator,但它不起作用,我收到错误

我必须读入包含内容的文件

2011 Regular Season
Boston 162 5710 875 1600 352 35 203
NY_Yankees 162 5518 867 1452 267 33 222
Texas 162 5659 855 1599 310 32 210
Detroit 162 5563 787 1540 297 34 169
St.Louis 162 5532 762 1513 308 22 162
Toronto 162 5559 743 1384 285 34 186
Cincinnati 162 5612 735 1438 264 19 183
Colorado 162 5544 735 1429 274 40 163
Arizona 162 5421 731 1357 293 37 172
Kansas_City 162 5672 730 1560 325 41 129

这是我读到的代码

static String specstat[][] = new String[1000][1000];

public static void main(String args[]) {

Arrays.sort(specstat, new Comparator<String[]>() {
        @Override
        public int compare(final String[] entry1, final String[] entry2) {
            final String time1 = entry1[0];
            final String time2 = entry2[0];
            return time1.compareTo(time2);
        }
    });

    for (final String[] s : specstat) {
        System.out.println(s[0] + " " + s[0]);
    }


    execute();
}

public static String[][] execute() {
    int line = 0;
    try {
        BufferedReader in = new BufferedReader(new FileReader(
                "files/input.txt"));

        String str;
        while ((str = in.readLine()) != null) {
            if (str.trim().length() == 0) {
                continue; // Skip blank lines
            }
            specstat[line] = str.split("\\s+");
            line++;
        }
        in.close();
    } catch (IOException e) {
        System.out.println("Can not open or write to the file.");
    }
    return specstat;

}

如何根据文本文件中最后(或任何)数字列的第一列对二维数组进行排序?

【问题讨论】:

  • 您为什么要使用数组而不是像地图列表这样的集合?
  • @fvu 什么是地图列表(数据是棒球统计数据)?
  • 我建议您创建一个类Team 来存储单个团队的数据。然后创建一个包含Team 对象的一维数组,并使用Comparator 类对其进行排序。
  • 另见example
  • @user222786 查看 rgettman 的回答,这是对这个想法的阐述(但 rgettman 为每个“行”使用类,这可以说是比使用地图更好的解决方案)

标签: java arrays sorting loops file-io


【解决方案1】:

据我了解,您希望通过排列其中数组的位置来对二维数组进行排序。您可以将Arrays.sort() 与自定义Comparator 一起使用,如下所示:

Arrays.sort(specstat, new Comparator<String[]>() {
    @Override
    public int compare(String[] array1, String[] array2) {
        //do your comparison here...
    }
});

使用String.compare() 或使用Integer.parseInt(String s) 比较数值可能会有所帮助。如果要对二维数组中的各个字符串数组进行排序,则必须单独对每个数组进行排序。

编辑:查看 cmets 以了解建议的比较方法。

【讨论】:

  • 如果我想比较每一行的最后一列,你如何进行比较?
  • 每个数组的最后一个条目是一个数字。因此,我们需要使用int num1 = Integer.parseInt(array1[array1.length - 1]); 获取数字并对num2 执行相同的操作,但使用array2。如果要按升序排序,则可以返回num1 - num2,如果要按降序排序,则可以返回num2 - num1。不过要小心:Integer.parseInt() 会抛出 NumberFormatException 如果它得到任何不是数字的东西。因此,您可能希望在排序时排除第一个 String 数组。
  • 请您编辑您的答案。这将非常有帮助
  • 是的,我刚刚修好了。对此感到抱歉。
  • 我不知道还能说什么。我已经告诉过你如何比较每个数组中的最后一个条目。
【解决方案2】:

我不会为此使用二维数组。

我将创建一个Team 类并为文件格式中的每个字段定义实例变量。然后我会创建一个实现Comparator(比如TeamComparator)的类,它定义了如何根据需要的任何标准比较Teams

然后,您可以拥有Teams 的数组或TeamsList

最后,您可以使用

对数组进行排序
Arrays.sort(teamsArray, new TeamComparator()) 

或带有

的列表
Collections.sort(teamsList, new TeamComparator())

【讨论】:

  • @rgettman 你能举例说明如何使用teamcomparator
  • 请阅读所有关于Comparator 的信息,使用我在回答中提供的链接——特别是关于如何在TeamComparator 类中实现compare 方法。
【解决方案3】:

您可以将Arrays.sort 与比较器一起使用。

【讨论】:

    【解决方案4】:

    使用QuickSort 对数组进行排序

    【讨论】:

      猜你喜欢
      • 2021-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-17
      • 1970-01-01
      • 2017-05-25
      • 2015-09-17
      相关资源
      最近更新 更多