我在Java中有2个数据数组。根据第一个数组的顺序,我必须排序下一个数组。 例如 -
String[] Array1 = {"EUROPE","MIDDLEEAST","OTHERs","AUSTRALIA"};
String[] Array2 = {"MIDDLEEAST","EUROPE","AUSTRALIA","OTHERs","ASIA","EUROPE"};
我的输出应该如下:
{"EUROPE","EUROPE","MIDDLEEAST","OTHERs","AUSTRALIA","ASIA"}
最好的方法是什么?
答案 0 :(得分:4)
要进行排序,您需要定义一个排序顺序,以便给定元素A和B,您可以轻松确定A是否应该在排序列表中的B之前或之后。
这个概念是用Java中Comparator
的概念形式化的。
在这种情况下,排序顺序由列表中元素的顺序定义。最简单的方法是给A和B在原始列表中找到它们中的每一个,记下找到的索引,并比较索引以找出哪个首先出现。
根据数据的大小,这可能太慢了。然后,您可以创建一个HashMap<String,Long>
,其中包含Array1中给定字符串的索引。这里它将保持“DEF” - > 0,“ABC” - > 1,“XYZ” - > 2。
答案 1 :(得分:0)
可能是这样的:
1)对它们进行排序。
2)创建空白结果表
3)从排序的Array2中获取第一个elem,并将其放在结果表中,其中包含排序Array1上第一个元素的原始索引
3)在第二个元素上重复步骤3,依此类推。
计算复杂度就像使用的排序方法:快速排序的O(nlogn)
答案 2 :(得分:0)
你绝对可以在O(n log n)中执行此操作。但最好的方法取决于更重要的是:快速,干净的代码或不分配额外的内存。
如果您不关心使用额外内存,可以分配一个单独的数组,其中每个元素都是一对:
public class Pair implements Comparable {
...
}
然后,您将使用Arrays.sort(Object[])
对数组进行排序。
如果您不想分配相当多的空间,可以使用包含Integer
形式的索引的辅助数组:
final String[] array1 = ...;
final String[] array2 = ...;
assert array1.length == array2.length;
Comparator<Integer> c = new Comparator<Integer> {
int compare(Integer a, Integer b) {
return array1[a].compareTo(array1[b]);
}
};
Integer[] aux = new Integer[array1.length];
for (int i = 0; i < aux.length; ++i) { aux[i] = i; }
Arrays.sort(aux, c);
String[] result = new String[array1.length];
for (int i = 0; i < aux.length; ++i) {
result[i] = array2[aux[i]];
}
如果您尝试就地执行整个操作而不分配额外的内存,那么您需要自己实现一种n-log-n排序算法...
答案 3 :(得分:0)
有(至少)两种方法对一个数组进行排序并重新排序第二个数组,以便相应的元素仍然匹配。两者都需要构建第三个数组并编写自定义比较函数。
方法1
定义包含每个数组的一个元素的自定义对象。 (在您的情况下,它可能是一个双元素的String数组。)为自定义对象编写一个比较器(或实现Comparable),它只是比较第一个数组中的元素。从两个输入数组构建自定义对象的数组,对第三个数组进行排序,然后提取结果。
这是此问题最常推荐的方法。
方法2
构造一个初始化为0, 1, 2, ..., n-1
的整数索引数组(其中n == Array1.length
)。使用比较器对索引数组进行排序,该比较器通过比较索引的Array1元素来比较索引。
第二种方法会更快,不需要那么多的对象构建。
答案 4 :(得分:0)
另外两个想法:
这些值可以是enum
而不是一组字符串吗?枚举的自然顺序是声明的顺序,因此Arrays.sort()
才有效。
帮助程序代码存在于Guava的Ordering.explicitOrder(List):
中String[] explicitOrder = {"EUROPE", "MIDDLEEAST", "OTHERs", "AUSTRALIA"};
String[] toSort = ...
Comparator<String> comparator = Ordering.explicit(Arrays.asList(explicitOrder));
String[] sorted = Arrays.sort(toSort, comparator);