Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 根据另一个数组中给定的索引顺序在数组中重新定位该项_Java_C#_Arrays_Algorithm - Fatal编程技术网

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

Java 根据另一个数组中给定的索引顺序在数组中重新定位该项,java,c#,arrays,algorithm,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"}. 注意:因

我有两个数组,如下所示

string[] alb = new string[5] 
             {
                "B","Z","C", "E","T"
             };
int[] orderedIndexes = {0,3,4,1,2}
根据第二个数组中给出的索引,我想对齐第一个数组中的项目。我不想使用另一个数组作为缓冲区,而是喜欢使用同一个数组来交换项目。我期望的结果是

alb = {"B","E","T","Z","C"}. 
注意:因为真正的问题是有真正的商业价值观,所以我不能发布我做的作业


非常感谢您的帮助。

首先,您应该检查该索引数组是否是如下所示的有效索引数组:

var isValidIndex = !Enumerable.Range(0, alb.Length - 1).Except(orderedIndexes).Any();
var result = orderedIndexes.Select(i => alb[i]).ToArray();

//result: {"B","E","T","Z","C"}
然后,您只需在
orderedIndex
上使用
Select
,如下所示:

var isValidIndex = !Enumerable.Range(0, alb.Length - 1).Except(orderedIndexes).Any();
var result = orderedIndexes.Select(i => alb[i]).ToArray();

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

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]);
            }
        }
    }
}
使用系统;
名称空间x
{
班级计划
{
静态void Main()
{
var alb=新[]{“B”、“Z”、“C”、“E”、“T”};
int[]OrderedIndex={2,0,1,4,3};
对于(var i=0;i
我从您那里得到的完美解决方案:)如下alb=OrderedIndex.选择(I=>alb[I]).ToArray();这将创建一个新的数组,并且要求声明“我不想使用另一个数组作为缓冲区,并且喜欢使用同一个数组来交换项目。”。我感谢您尝试了以下内容-->var alb=new[]{“B”、“Z”、“C”、“E”、“t”};int[]OrderedIndex={4,3,1,2,0};因为在交换数组中的项时,SortedIndex不再有效。这几乎是正确的,但是您忘记在交换中分配
OrderedIndex[i]
。更正后,这实际上是OP问题的答案,因为它解决了问题。哇,你是对的@classic_vmk。也许我应该写一个单元测试:)。好的,我相信它现在应该可以工作了。索引上的交换花了我一分钟才纠正!这与我实施的解决方案相同:)