Java 按优先级列表排序
Java order by priority list
给定对象列表(List<MyClass>
个对象)。
class MyClass {
int id;
String name;
}
以及一个包含名称的列表:
- 名字 1
- name2
- name3
编写比较器以使用名称列表作为优先级列表的好方法是什么?如果名称不存在优先级,则使用字母顺序?
将字符串放入一个数组中并循环遍历它以查看您先遇到哪个。
public class NameComparator implements Comparator {
static private [] String strNames = {"Ken", "Alisia", "Ben"};
public int compare(MyClass objX, MyClass objY) {
String x = objX.Name;
String y = objY.Name;
String strCurrentName;
if(x.equals(y)) {
return 0;
}
for(strCurrentName: strNames) {
if(strCurrentName.equals(x)) {
return 1;
}
if(strCurrentName.equals(y)) {
return -1;
}
}
return x.compareTo(y);
}
}
用这个比较器排序会给你,例如,"Ken"、"Alicia"、"Michelle" 和 "Nancy"。
如果速度有问题,您可以将名称放在 HashMap 而不是数组中。那么代码就大不一样了,有兴趣的可以举个例子
我建议您使用 java.util.Collections.sort
方法,并提供自定义比较器。
// Define a new static comparator attribute for your class
public static Comparator<MyClass> MY_COMPARATOR = new Comparator<>() {
@Override
public int compare(MyClass o1, MyClass o2) {
return o1.name.compareTo(o2.name); // or whatever logic
}
};
//Then just call this to sort when you need it
List<MyClass> myList; // initialised somewhere
Collections.sort(myList, MY_COMPARATOR);
如果您使用的是 java 8+,那么创建比较器的代码会更短:
public static Comparator<MyClass> MY_COMPARATOR = (o1, o2) -> o1.name.compareTo(o2.name);
给定对象列表(List<MyClass>
个对象)。
class MyClass {
int id;
String name;
}
以及一个包含名称的列表:
- 名字 1
- name2
- name3
编写比较器以使用名称列表作为优先级列表的好方法是什么?如果名称不存在优先级,则使用字母顺序?
将字符串放入一个数组中并循环遍历它以查看您先遇到哪个。
public class NameComparator implements Comparator {
static private [] String strNames = {"Ken", "Alisia", "Ben"};
public int compare(MyClass objX, MyClass objY) {
String x = objX.Name;
String y = objY.Name;
String strCurrentName;
if(x.equals(y)) {
return 0;
}
for(strCurrentName: strNames) {
if(strCurrentName.equals(x)) {
return 1;
}
if(strCurrentName.equals(y)) {
return -1;
}
}
return x.compareTo(y);
}
}
用这个比较器排序会给你,例如,"Ken"、"Alicia"、"Michelle" 和 "Nancy"。
如果速度有问题,您可以将名称放在 HashMap 而不是数组中。那么代码就大不一样了,有兴趣的可以举个例子
我建议您使用 java.util.Collections.sort
方法,并提供自定义比较器。
// Define a new static comparator attribute for your class
public static Comparator<MyClass> MY_COMPARATOR = new Comparator<>() {
@Override
public int compare(MyClass o1, MyClass o2) {
return o1.name.compareTo(o2.name); // or whatever logic
}
};
//Then just call this to sort when you need it
List<MyClass> myList; // initialised somewhere
Collections.sort(myList, MY_COMPARATOR);
如果您使用的是 java 8+,那么创建比较器的代码会更短:
public static Comparator<MyClass> MY_COMPARATOR = (o1, o2) -> o1.name.compareTo(o2.name);