You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何关联元素与分数数组,自定义排序后输出对应元素编号

问题

我在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],根本无法对应正确的编号。

要解决这个问题,核心是让分数和对应的编号绑定交换:

  1. 首先把原始的所有元素编号存入一个独立数组(比如elementIds),确保它和result数组的索引一一对应(即elementIds[k]是result[k]对应的元素编号)。
  2. 在排序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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 18:50:46