【问题标题】:Java - Sort arrays by first array index?Java - 按第一个数组索引对数组进行排序?
【发布时间】:2018-05-17 10:16:49
【问题描述】:

我是 java 新手(并且不太擅长解释,但我会尽力而为),并且在我的任务中,我必须根据数组 1 排序对其他数组进行排序。 假设我们有三个二维数组并根据名称数组对其进行排序:

 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

我必须做什么才能实现这一目标?

【问题讨论】:

  • 请求家庭作业帮助的问题必须包括您迄今为止为解决问题所做的工作的摘要,以及对您在解决它时遇到的困难(help centerHow to Ask)。
  • 对第一个数组进行排序。之后迭代它并分配其他值的所有值。应该相对容易,因为您拥有迭代第一个数组的所有索引,并且可以将它们放入其他数组中。当然,您需要某种额外的数据结构来创建链接。例如PersonData 类。然后是List<PersonData>
  • 请遵守命名约定。变量名以小写字母开头,类以大写字母开头。此外,您可能想使用double 而不是Double(这是不同的)。
  • 或者您还想更改其他阵列的顺序吗?在这种情况下,我建议暂时将 everything 移动到容器中,例如 List<PersonData>。然后根据名称对该列表进行排序。之后,如果您真的需要数组,则从中重新创建数组。
  • @Zabuza 感谢您的建议,是的,我要做的是在对第一个数组进行排序后更改其他数组的顺序。所以基本上我需要做的就是将其他数组添加到临时列表中并重新排序列表?

标签: java arrays sorting indexing


【解决方案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)

或者你直接使用你的新结构

List<List<PersonData>>

所有东西都被容器类很好地组合在一起。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 2022-01-28
    • 2011-12-17
    • 2013-08-18
    相关资源
    最近更新 更多