根据另一个数组中给出的索引顺序,将项重新定位在数组中

时间:2015-05-15 17:39:06

标签: java c# arrays algorithm

我有两个数组如下。

string[] alb = new string[5] 
             {
                "B","Z","C", "E","T"
             };
int[] orderedIndexes = {0,3,4,1,2}

根据第二个数组中给出的索引,我想对齐第一个数组中的项目。我不想使用另一个数组作为缓冲区,并喜欢使用相同的数组来交换项目。我期待的结果就像

alb = {"B","E","T","Z","C"}. 

注意:由于真正的问题是拥有真正的商业价值,我无法发布我做的家庭作业。

任何帮助都会非常感激。

2 个答案:

答案 0 :(得分:3)

linq的答案绝对是好的,但我认为以旧式数组操作方式解决它会很有趣。此外,部分问题提到没有创建缓冲区,对我来说,linq的答案有些违反。无论如何,它的价值......

using System;

namespace x
{
    class Program
    {
        static void Main()
        {
            var alb = new[] { "B","Z","C","E","T" };
            int[] orderedIndexes = {2,0,1,4,3};

            for (var i = 0; i < orderedIndexes.Length; i++)
            {
                var x = orderedIndexes[i];
                var ts = alb[i];
                alb[i] = alb[x];
                alb[x] = ts;
                x = Array.IndexOf(orderedIndexes, i);
                var ti = orderedIndexes[i];
                orderedIndexes[i] = orderedIndexes[x];
                orderedIndexes[x] = ti;
            }

            for (var i = 0; i < orderedIndexes.Length; i++)
            {
                Console.WriteLine("{0}, {1}", i, alb[i]);
            }
        }
    }
}

答案 1 :(得分:1)

首先,您应该检查该索引数组是否是这样的有效索引数组:

var isValidIndex = !Enumerable.Range(0, alb.Length - 1).Except(orderedIndexes).Any();

然后,您只需使用Select上的orderedIndexes,就像这样:

var result = orderedIndexes.Select(i => alb[i]).ToArray();

//result: {"B","E","T","Z","C"}