在Java中对一个二维字符串数组进行排序

3

我为一个读取文件、处理数据并将其打印出来的项目创建了一个Java中的二维数组。唯一的问题是我试图按字母顺序对二维数组进行排序。

这是文件输入的示例:

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

这是输出结果的示例:

2011 Regular Season
====================
Boston:     .280 .461
NY_Yankees: .263 .444
Texas:      .283 .460
Detroit:    .277 .434
St.Louis:   .273 .425
Toronto:    .249 .413
Cincinnati: .256 .408
Colorado:   .258 .410
Arizona:    .250 .413
Kansas_City:.275 .415
====================
Big Ten Av: .266 .428

我的目标是按字母顺序对团队名称进行排序。我尝试使用Array.sort()方法和使用比较器,但都没有成功。我将包括我现在拥有的工作代码,并且任何帮助都将是非常好的!

package problem_1;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.Arrays;
import java.util.Comparator;

public class sluggers2 {

static String specificstat[][] = new String[1000][1000]; //Create a 2-dimensional array with limits of 1000
static DecimalFormat df = new DecimalFormat(".###");//Variable to round the integers to 3 decimal places

public static void main(String args[]) { //Main method
    execute(); //Call on the function "execute" and execute it
    baseballstats(1);
}

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

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

public static void baseballstats(int teamnumber) {
    double batting_average, slugging_average = batting_average = 0;

            //Arrays.sort(specificstat[0]);
            //Tried sorting the first dimension but it didn't work

    System.out.println(specificstat[0][0] + " " + specificstat[0][1] + " " + specificstat[0][2]);
    System.out.println("====================");

    while (teamnumber <= 10) {

        double B = Integer.parseInt(specificstat[teamnumber][5]);
        double C = Integer.parseInt(specificstat[teamnumber][6]);
        double D = Integer.parseInt(specificstat[teamnumber][7]);
        double A = Integer.parseInt(specificstat[teamnumber][4]) - (B + C + D);

        double slug_avg = ((A + 2*B + 3*C + 4*D) / Integer.parseInt(specificstat[teamnumber][2]));
        double y = Integer.parseInt(specificstat[teamnumber][4]), z = Integer.parseInt(specificstat[teamnumber][2]), bat_avg = y / z;

        slugging_average = slugging_average + slug_avg;
        batting_average = batting_average + bat_avg;

        double hits = Integer.parseInt(specificstat[teamnumber][4]);
        double at_bats = Integer.parseInt(specificstat[teamnumber][2]);

        String batting = df.format(hits / at_bats), slugging = df.format(slug_avg);

        if (slugging.length() == 3)
            slugging = slugging + "0";

        if (batting.length() == 3)
            batting = batting + "0";

        System.out.println(specificstat[teamnumber][0] + ":  " +  "\t" + batting + " " + slugging);
        teamnumber++;
    }

    String big_ten_av = "\t" + df.format(batting_average / 10) + " "+ df.format(slugging_average / 10);

    System.out.println("====================");
    System.out.print("Big Ten Av: "); System.out.print(big_ten_av);
}
}

我对编程比较新,所以希望能得到您的帮助。


1
你的代码需要使用集合和对象。不要使用带有任意限制的二维数组。使用List<Line>,其中Line是一个类,包含文件中一行所包含的所有信息,并存储在良好命名和类型的属性中(例如String team,double slugging,double batting)。 - JB Nizet
可能是根据一列对二维数组进行排序的重复问题。 - Thomas Mueller
2个回答

3
你需要这样的东西:
Arrays.sort( specificstat, new Comparator<String[]> {
    public int compare( String[] s1, String[] s2 ) {
        return s1[0].compareTo(s2[0]);
    }
} );

基本上这个语句的意思是通过比较内部数组的第一个元素来对 specificstat 的内部数组进行排序...

1

Lucas的另一个解决方案是完全消除2D数组,使用某个类的数组,例如:

class TeamRecord implements Comparable {
  public String teamName;
  public ArrayList<Integer> stats;

  int compareTo(TeamRecord other) {
    return teamName.compareTo(other.teamName);    
  }

}

并更改您的:

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

to:

static TeamRecord specificstat[] = new TeamRecord[1000];

然后,Array.sort(specificstat)将根据teamName进行排序。
这种方法的优点在于它使您的数据更清晰,因为团队名称与统计数据确实是不同类型的事物;在这里,类型使这一点立即变得清晰。
我省略了填充该数据类型数组的代码,但我认为您可以想出来。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接