【问题标题】:How do I sort a 2d array based on the values of another array?如何根据另一个数组的值对二维数组进行排序?
【发布时间】:2015-08-25 05:51:46
【问题描述】:

所以我必须从文本文件中读取一些文本行

S5555;100 70 70 100
S3333;50 50 50 50
S2222;20 50 40 70
S1111;90 80 90 85
S4444;70 80 90 50

我应该将文本变成 2 个数组。一个数组存储学生的 ID,另一个数组存储学生的分数(二维数组)。

现在我需要按字母顺序对学生 ID 进行排序。如何根据我对一维数组的排序方式对二维数组进行排序?

【问题讨论】:

  • 到目前为止你尝试过什么?
  • 刚刚意识到我很笨。我本可以将文本转换为数组,然后先对其进行排序...
  • 不要将一起属于的数据分开到不同的数组中。为课程(课程名称、标记)和学生(id、课程列表)创建对象。为学生使用通用列表,而不是固定大小的数组。阅读关于 Anti-Pattern: Parallel Collections 的 Jon Skeets 博客

标签: c# arrays sorting multidimensional-array


【解决方案1】:

全面披露:我是 C 程序员,而不是 C# 程序员,所以这可能不是标准的 C# 方法。无论如何,它会起作用,它是可读的,而且是有意义的。这是我会在 c++ 或 java 中做的事情,所以我敢打赌它会延续到 c#。

我将从我的老派 C 背景中借鉴一页,并说我认为struct 的概念在这里可能会有所帮助。

如果您正在编写 c#,您可能知道什么是类,对吧?结构只是一个类,它的所有内部变量都是公开的。如果我必须从文件中读取具有 id# 和薪水的员工列表,然后按 id 编号对它们进行排序,我将有一个这样的结构:

public struct employee
{
    int idnum;
    int yearly_salary;
    String name;
}

每次我声明一个新的员工变量时,它都会附带 3 个“字段”(idnumyearly_salaryname)。看看这个例子。它创建了 2 个名为 emp1 和 emp2 的新员工结构。

employee emp1;
emp1.name = "Lisa Goodwin";
emp1.yearly_salary = 129200;
emp1.idnum = 3911;

employee emp2;
emp2.name = "Sevn Rushbjorn";
emp2.yearly_salary = 39800;
emp2.idnum = 8721;

如果我们想打印 id# 最低的员工的工资,我们可以执行以下操作:

if(emp1.idnum < emp2.idnum)
{
    Console.WriteLine("salary = ${0}\n", emp1.yearly_salary);
}
else
{
    Console.WriteLine("salary = ${0}\n", emp2.yearly_salary);
}

最重要的是,当您在一个数组中交换 2 个员工时,当然,他们所有对应的值都会被交换。

employee emps[4];
//...... initialize vars from file or whatever...

swap<employee>(emps[3], emps[2]);

使用这些概念,您可以在排序方法中比较 id#(我假设您是自己编写的,因为这听起来像家庭作业),并使用 c# 的标准交换函数来交换 2 个员工(或者,在您的案例,学生)。

只需将我的“员工”示例改编为学生,这应该可以正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 2021-03-26
    • 2015-08-05
    • 2013-10-22
    • 2014-07-30
    • 2022-01-10
    • 2018-08-17
    相关资源
    最近更新 更多