我有两个数组。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]
作为排序示例,以下是如何先按elem2
对ParallelNumbers
元素进行排序,然后按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]
正如你所要求的那样,不是吗?
编辑:以前也写过类似的东西。例如,请参见反模式:并行集合和并行数组。