如何关联元素与分数数组,自定义排序后输出对应元素编号
问题
我在txt文件中存有25个元素,代码已根据答案键计算出它们的分数。我希望不使用Array.Sort等方法实现排序,现已完成排序并将分数存入名为result的数组。现在我需要根据result数组的排序顺序,输出对应的元素编号。
示例:元素101的分数为78,元素105的分数为25;result数组排序后为[78,25],我希望输出对应的元素编号序列[101,105]。
我的代码如下:
//arranging results according to their values int temp = 0; int[] elm = new int[result.Length]; for (int i = 0; i <= result.Length-1 ; i++) { for (int j = i+1 ; j < result.Length; j++) { if (result[i] < result[j]) { temp = result[i]; result[i] = result[j]; result[j] = temp; } elm[j] = Convert.ToInt16(row[i,0]); } }
同时我想了解,如何在两个不同数组中建立元素与对应分数的关联?
解决方案
一、修正排序代码,同步维护元素编号
你当前的代码只对分数数组result做了排序,但没有同步处理元素编号,而且elm数组的赋值逻辑完全错误——它没有跟着分数的交换同步更新,反而把row[i,0]的值重复赋值给elm[j],根本无法对应正确的编号。
要解决这个问题,核心是让分数和对应的编号绑定交换:
- 首先把原始的所有元素编号存入一个独立数组(比如
elementIds),确保它和result数组的索引一一对应(即elementIds[k]是result[k]对应的元素编号)。 - 在排序
result数组时,每次交换分数的位置,就同步交换elementIds数组里对应索引的元素。
修正后的代码如下:
// 假设已初始化:elementIds是原始元素编号数组,result是对应分数数组 int tempScore = 0; int tempId = 0; // 手动实现降序排序(升序的话把判断条件改成result[i] > result[j]) for (int i = 0; i < result.Length; i++) { for (int j = i + 1; j < result.Length; j++) { if (result[i] < result[j]) { // 交换分数 tempScore = result[i]; result[i] = result[j]; result[j] = tempScore; // 同步交换对应编号 tempId = elementIds[i]; elementIds[i] = elementIds[j]; elementIds[j] = tempId; } } } // 排序完成后,elementIds就是和排序后result对应的编号序列 foreach (int id in elementIds) { Console.WriteLine(id); }
二、更可靠的关联方式:用自定义类型替代独立数组
用两个独立数组存编号和分数很容易出错(比如排序时漏同步、索引错位),更稳妥的做法是把元素编号和分数封装成一个整体,让两者天然绑定。
方法1:使用结构体
结构体适合这种轻量、值类型的场景:
// 定义结构体,把编号和分数绑定 public struct ElementScore { public int ElementId { get; set; } public int Score { get; set; } }
然后创建结构体数组,排序时直接比较Score字段:
// 初始化数组(从txt读取数据后填充) ElementScore[] elementScores = new ElementScore[25]; // 示例填充数据 elementScores[0] = new ElementScore { ElementId = 101, Score = 78 }; elementScores[1] = new ElementScore { ElementId = 105, Score = 25 }; // 手动排序(降序) ElementScore temp; for (int i = 0; i < elementScores.Length; i++) { for (int j = i + 1; j < elementScores.Length; j++) { if (elementScores[i].Score < elementScores[j].Score) { temp = elementScores[i]; elementScores[i] = elementScores[j]; elementScores[j] = temp; } } } // 输出排序后的元素编号 foreach (var item in elementScores) { Console.WriteLine(item.ElementId); }
方法2:使用类
如果需要后续扩展功能(比如继承、多态),可以用类代替结构体:
public class ElementScore { public int ElementId { get; set; } public int Score { get; set; } }
使用方式和结构体基本一致,只是初始化时需要用new ElementScore()来创建实例。
方法3:使用键值对(KeyValuePair)
如果不想自定义类型,也可以直接用.NET内置的KeyValuePair<int, int>,键存元素编号,值存分数:
KeyValuePair<int, int>[] elementScores = new KeyValuePair<int, int>[25]; elementScores[0] = new KeyValuePair<int, int>(101, 78); elementScores[1] = new KeyValuePair<int, int>(105, 25); // 手动排序(降序) KeyValuePair<int, int> temp; for (int i = 0; i < elementScores.Length; i++) { for (int j = i + 1; j < elementScores.Length; j++) { if (elementScores[i].Value < elementScores[j].Value) { temp = elementScores[i]; elementScores[i] = elementScores[j]; elementScores[j] = temp; } } } // 输出排序后的元素编号 foreach (var kvp in elementScores) { Console.WriteLine(kvp.Key); }
内容的提问来源于stack exchange,提问作者baser
相关产品推荐
相关产品推荐

