在java中进行比较和排序

时间:2012-01-19 07:45:54

标签: java sorting compare

我在Java中有2个数据数组。根据第一个数组的顺序,我必须排序下一个数组。 例如 -

String[] Array1 = {"EUROPE","MIDDLEEAST","OTHERs","AUSTRALIA"};
String[] Array2 = {"MIDDLEEAST","EUROPE","AUSTRALIA","OTHERs","ASIA","EUROPE"};

我的输出应该如下:

{"EUROPE","EUROPE","MIDDLEEAST","OTHERs","AUSTRALIA","ASIA"}

最好的方法是什么?

5 个答案:

答案 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)

另外两个想法:

  1. 这些值可以是enum而不是一组字符串吗?枚举的自然顺序是声明的顺序,因此Arrays.sort()才有效。

  2. 帮助程序代码存在于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);