我正在尝试将数组排序为特定顺序。例如,我有这个数组
{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];
}
}
}
}
它工作正常,但是,我不确定这是否是最快和更简单的方式来处理速度和内存,因为列表可能有太多数字。
答案 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”循环对要快。
由于您还没有描述实际的用例,因此很难告诉更多。例如,如果您仅具有这些数字,则可能不需要将排序结果作为实际列表。但是,如果这些数字只是对象的一部分,则此构建统计方法不适用。