我有一个名为apple的类,它包含3个值int x
,int y
和int weight
。然后我创建了一个苹果类型对象的数组。现在我想根据权重对对象数组进行排序,这意味着具有最低权重的苹果对象应该是第一个,依此类推。
我知道有很多方法可以通过使用Arrays.sort等或比较器来实现这一目标。
我想知道在Java中这种方法的最快方法是什么?可能有一个案例,我有500,000个对象,所以我想知道我应该使用哪种,更重要的是哪种方法会给我最好的方法。我甚至用Hoare分区编写了自己的快速排序。
Apple类代码
public class Apple {
public int x;
public int y;
public int weight;
public Apple(int a, int b, int w) {
x = a;
y = b;
weight = w;
}
}
主类代码
public class main {
static Apple[] appleArray;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int size = sc.nextInt();
int totalApples = sc.nextInt();
appleArray = new Edge[totalApples];
int x = 10;
int y = 20;
int w = 30;
for (int i = 0; i < size; i++) {
appleArray[i] = new Apple(x, y, w);
x++;
y++;
w++;
}
//Now i want to sort array of apple objects based on weight
}
}
答案 0 :(得分:8)
本书提供了一个有用的备忘单,用于根据您的需求确定最佳排序:https://www.safaribooksonline.com/library/view/algorithms-in-a/9780596516246/ch04s09.html
最简单的解决方案
Arrays.sort
命令使用quicksort implementation,适用于许多情况。对于您的示例代码,可能是:
Arrays.sort(appleArray, new Comparator<Apple>(){
@Override
public int compare(Apple apple1, Apple apple2){
return apple1.weight - apple2.weight;
}
});
最快的解决方案
在你的情况下,你有一个包含重复的大型数组,例如阵列中的50,000个苹果可能都重3盎司......因此,您可能选择实施bucket sort以提高快速排序的性能,在这种情况下浪费。这是一个example implementation。
也许在一些研究选择的基础上,使用适合的Java API来确定输入集的最佳解决方案。
答案 1 :(得分:7)
我首先使用Java API。如果这还不够快,那么我会搜索优化的排序库。
另外考虑一个数据库,数据库引擎速度快,并且可以对大型数据集进行优化。
答案 2 :(得分:3)
您可以使用Arrays.sort
传递自定义Comparator
或将Apple
定义为Comparable
答案 3 :(得分:2)
我们可以将Collections.sort与自定义Comparator一起使用。
class Apple {
public final int weight;
// ...
};
List<Apple> apples = // ...
Collections.sort(apples, new Comparator<Apple>() {
@Override public int compare(Apple a1, Apple a2) {
return a1.weight - a2.weight; // Ascending
}
});
答案 4 :(得分:2)
如果你的对象中有任何你需要排序的数字或整数,你可以这样做 -
List<Object> obj = new ArrayList<Object>();
Collections.sort(obj, new Comparator<Object>() {
@Override
public int compare(Object object1, Object object2) {
return object1.getNumber() > object2.getNumber() ? 1 : -1;
}
});
如果没有Number或Integer,你可以对它进行排序,而你只是在你的对象中使用字符串,而不是通过枚举为字符串赋值。
enum Code {
Str1(1), Str2(2), Str3(3), Str4(4), Str5(5));
int sortNumber;
Code(int sortNumber) {
this.sortNumber = sortNumber;
}
int returnNumber() {
return sortNumber;
}
};
public static void main(String[] args) {
List<Object> obj = new ArrayList<Object>();
Collections.sort(obj, new Comparator<Object>() {
@Override
public int compare(Object object1, Object object2) {
return Code.valueOf(object1.getStr()).returnNumber() > Code.valueOf(object2.getStr()).returnNumber() ? 1 : -1;
}
});
}
答案 5 :(得分:0)
在 Java8 附带的新 lambda 表达式的帮助下,现在对自定义对象数组进行排序变得更容易和更短。下面的代码展示了当前场景中 lambda 表达式的使用。
path\src\api\v1\controllers\Site>node child.controller.js
undefined
Database Connected Successfully...
error