对一个具有重复元素的数组进行排序时更新并行数组



我有两个数组。CCD_ 1。CCD_ 2。

我想并行使用这两个数组。类似于当Array2的元素改变顺序时,则Array1的元素相应地改变顺序。因此,对于我的程序,我对Array2进行了排序,它变成了Array2=[1,2,2,5,7]。因此必须将Array1更改为Array1=[3,3,5,2,4]

我想知道如何做到这一点(psudocode或java或c++)。我在下面提供了我在C++中尝试的代码问题是当一个元素重复时,它不起作用因此,在它对Array2[1,2,2,5,7]进行排序后,它将Array1更新到Array1=[5,4,3,3,2]0(您应该通过查看下面的代码来理解它为什么会给出这个输出)。

所以我的任务是当Array2更新时(elemnts更改顺序),Array1也应该更新。当Array2具有重复元素时,它必须工作。

k=0;
for(int i=0;i<n;i++)
{
int a=arr1[i];
for(int j=0;j<n;j++)
{
if(a==arr2[j])
{
arr4[k]=arr1[j];
k++;
break;
}
}
}

如果数组必须是并行的,对它们进行排序的更好方法是使用第三个索引数组,并根据Array2对这些整数进行排序。请注意,这是C++代码,而不是Java:

#include <algorithm>
#include <array>
#include <iostream>
int main()
{
std::array<int, 5> Array1 = {{5,4,3,3,2}};
std::array<int, 5> Array2 = {{2,7,1,2,5}}; 
std::array<int, 5> indices = {{0,1,2,3,4}};
// only sort the indices, based on Array2
std::sort(indices.begin(), indices.end(), [&](int n1, int n2)
{ return Array2[n1] < Array2[n2]; });
// output results
for (auto& i : indices)
std::cout << Array1[i] << " ";
std::cout << "n";
for (auto& i : indices)
std::cout << Array2[i] << " ";
}
Output:
3 5 3 2 4 
1 2 2 5 7 

输出函数也可以这样写:

// output results
for (int i = 0; i < 5; ++i)
std::cout << Array1[indices[i]] << " ";
std::cout << "n";
for (int i = 0; i < 5; ++i)
std::cout << Array2[indices[i]] << " ";

我建议使用不同的解决方案,如果您不想使用,请放弃。设计一个具有两个字段的类,一个用于数组1中的数字,另一个用于阵列2中的数字。从这个类中生成一个对象数组,而不是两个int数组。现在,无论数组如何重新排序,每个原始数组中的数字都将始终跟随在一起。此外,根据需要,可以很容易地按第一个或第二个数字进行排序。

我没想到会为您编写代码,但应您的要求,这里有一些有用的Java片段可以帮助您入门。这个类非常简单,有两个字段,构造函数和getter:

public class ParallelNumbers {
/** number from array 1 */
int elem1;
/** number from array 2 */
int elem2;
public ParallelNumbers(int elem1, int elem2) {
this.elem1 = elem1;
this.elem2 = elem2;
}
public int getElem1() {
return elem1;
}
public int getElem2() {
return elem2;
}
}

当然,您可以添加toString方法以及您可能喜欢的其他方法。既然你更了解你的域,你也可以为类找到一个更好的名称。有了这个课程,你可以做:

ParallelNumbers[] all = new ParallelNumbers[] { new ParallelNumbers(5, 2), new ParallelNumbers(4, 7),
new ParallelNumbers(3, 1), new ParallelNumbers(3, 2), new ParallelNumbers(2, 5) };
System.out.println("Numbers from array 1: " 
+ Arrays.stream(all).map(ParallelNumbers::getElem1).collect(Collectors.toList()));
System.out.println("Numbers from array 2: " 
+ Arrays.stream(all).map(ParallelNumbers::getElem2).collect(Collectors.toList()));

您将在打印输出中识别出您的原始阵列:

Numbers from array 1: [5, 4, 3, 3, 2]
Numbers from array 2: [2, 7, 1, 2, 5]

作为排序示例,以下是如何先按elem2ParallelNumbers元素进行排序,然后按elem1对其进行排序(以解决冲突):

Arrays.sort(all, 
Comparator.comparingInt(ParallelNumbers::getElem2).thenComparingInt(ParallelNumbers::getElem1));
System.out.println("Numbers from array 1: " 
+ Arrays.stream(all).map(ParallelNumbers::getElem1).collect(Collectors.toList()));
System.out.println("Numbers from array 2: " 
+ Arrays.stream(all).map(ParallelNumbers::getElem2).collect(Collectors.toList()));

这次打印:

Numbers from array 1: [3, 3, 5, 2, 4]
Numbers from array 2: [1, 2, 2, 5, 7]

正如你所要求的那样,不是吗?

编辑:以前也写过类似的东西。例如,请参见反模式:并行集合和并行数组。

最新更新