Java - 按第一个数组索引排序数组?

时间:2017-12-04 00:55:23

标签: java arrays sorting indexing

我是java的新手(并且不太好解释,但我会尽我所能)并且在我的任务中我将根据数组1的排序对其他数组进行排序。 假如我们有三个2d数组,并根据Names数组对它进行a-z排序:

 String[][]Names = { {"Bob", "James", "Mary", "Felix"}, {"Calvin", "Kurt", "Chris", "Ethan" } };
 int[][]Age = { {19, 20, 30, 33} , {20, 31, 51, 43} };
 Double[][]Hours_Worked = { {19.5, 20.4, 39.9, 25.2} , {5.5, 10.9, 15.2, 20.9} };

然后一旦它被排序,其他数组就像输出中的值一样遵循左右:

Bob : 19 : 19.5
Calvin : 20 : 5.5
Chris : 31 : 10.9

我该怎么做才能实现这个目标?

1 个答案:

答案 0 :(得分:0)

我能想象的最简单,最易读的方法是首先解析数据并创建容器类,它们代表数据项{{1}之间的相关性}。之后以某种方式收集它,保留结构PersonData。然后你可以根据自己喜欢的方式排序。如果您确实需要这些单独的数组,那么再次提取信息。

首先是容器类

List<List<PersonData>>

现在解析和收集

public class PersonData {
    private String mName;
    private int mAge;
    private double mHoursWorked;

    public PersonData(String name, int age, double hoursWorked) {
        this.mName = name;
        this.mAge = age;
        this.mHoursWorked = hoursWorked
    }

    public String getName() {
        return this.mName;
    }

    public int getAge() {
        return this.mAge;
    }

    public double getHoursWorked() {
        return this.mHoursWorked;
    }
}

接下来是排序,假设组本身没有排序:

String[][] nameData = ...
int[][] ageData = ....
double[][] hoursWorkedData = ...

List<List<PersonData>> data = new ArrayList<>();
for (int outer = 0; outer < nameData.length; outer++) {
    // Create a new group
    List<PersonData> group = new ArrayList<>();

    for (int inner = 0; inner < nameData[outer].length; inner++) {
        // Process this person
        String name = nameData[outer][inner];
        int age = ageData[outer][inner];
        double hoursWoked = hoursWorkedData[outer][inner];

        group.add(new PersonData(name, age, hoursWorked);
    }

    // Add that group
    data.add(group);
}

或者如果您让data.forEach(group -> { Collections.sort(group, Comparator.comparing(PersonData::getName)); }); 实施PersonData它只是:

Comparable

之后再次提取信息并重新创建数组:

data.forEach(Collections::sort);

或者您直接使用新结构

String[][] sortedNameData = data.stream()  // Stream<List<PersonData>>
    .map(group -> group.stream()           // sub Stream<PersonData>
        .map(PersonData::getName)          // sub Stream<String>
        .toArray(String[]::new))           // Stream<String[]>
    .toArray(String[][]::new)              // String[][]

int[][] sortedAgeData = data.stream()
    .map(group -> group.stream()
        .map(PersonData::getAge)
        .toArray(int[]::new))
    .toArray(int[][]::new)

double[][] sortedHoursWorkedData = data.stream()
    .map(group -> group.stream()
        .map(PersonData::getHoursWorked)
        .toArray(double[]::new))
    .toArray(double[][]::new)

通过容器类将所有内容组合在一起。