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。也许我应该写一个单元测试:)。好的,我相信它现在应该可以工作了。索引上的交换花了我一分钟才纠正!这与我实施的解决方案相同:)