在Java中按特定顺序对数组进行排序

时间:2018-07-28 12:35:18

标签: java performance sorting

我正在尝试将数组排序为特定顺序。例如,我有这个数组

{6,1,1,5,6,1,5,4,6}

我希望它们按此顺序排序

{4,1,6,5}

预期的新数组为

 {4,1,1,1,6,6,6,6,5}

我的想法是这个

public class Sort {

    static int[] list = { 6, 1, 1, 5, 6, 1, 6, 4, 6 };
    static int[] sorted = { 4, 1, 6, 5 };
    static int[] newList = new int[list.length];
    static int count = 0;

    public static void main(String[] args) {
        for (int i = 0; i < sorted.length; i++) {
            for (int j = 0; j < list.length; j++) {

                if (list[j] != sorted[i])
                    continue;
                else
                    newList[count++] = sorted[i];

            }
        }
    }
}

它工作正常,但是,我不确定这是否是最快和更简单的方式来处理速度和内存,因为列表可能有太多数字。

2 个答案:

答案 0 :(得分:3)

您可以将Java内置排序算法与自定义比较器一起使用。

public static void main(String[] args) {

    Integer[] list = { 6, 1, 1, 5, 6, 1, 6, 4, 6 };
    int[] sorted = { 4, 1, 6, 5 };

    Map<Integer, Integer> order = new HashMap<>();
    for (int i = 0; i < sorted.length; i++)
        order.put(sorted[i], i);

    Arrays.sort(list, (a ,b) -> order.get(a) - order.get(b));

    System.out.println(Arrays.toString(list));
}

输出为[4, 1, 1, 1, 6, 6, 6, 6, 5]

答案 1 :(得分:1)

如果您

  • 提前了解可能的元素
  • 他们是相对较小的数字

您可以简单地计算它们:

int stats[]=new int[7]; // "largest possible element"+1
for(int i=0;i<list.length;i++)
  stats[list[i]]++;

然后重建有序列表:

int idx=0;
for(int i=0;i<sorted.length;i++){
  int val=sorted[i];
  for(int j=stats[val];j>0;j--)
    newlist[idx++]=val;

这两个代码段总共具有“ 2 * list.length”步,这可能比原始的“ sorted.length * list.length”循环对要快。
由于您还没有描述实际的用例,因此很难告诉更多。例如,如果您仅具有这些数字,则可能不需要将排序结果作为实际列表。但是,如果这些数字只是对象的一部分,则此构建统计方法不适用。