Java 按优先级列表排序

Java order by priority list

给定对象列表(List<MyClass> 个对象)。

class MyClass {
    int id;
    String name;
}

以及一个包含名称的列表:

  1. 名字 1
  2. name2
  3. 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);