根据特定的预定义顺序对 TreeSet 中的对象进行排序

Sorting objects in a TreeSet based on a particular predefined order

我有一个对象 class,Project 具有属性 labelvalue。我将对象存储在一个集合中。问题是我需要根据预定义的标签顺序检索对象属性。我无法理解如何为 TreeSet 提供一个比较器来实现它。

public class Project {

    String label;

    String value;

   //Setters & getters
}

    project1.setLabel("Project Name");
    project1.setValue("Solar Project");

    project2.setLabel("Project Type");
    project2.setValue("Government");

我期望的输出是

Project Name=Solar Project, Project Type=Government

但是因为是Set,顺序并不总是一样的。

我可以通过 HashMap 和 TreeMap 组合来做同样的事情。

Map<Integer, String> detailsHashMap = new HashMap<Integer, String>();
switch (person.getLabel()) {
    case "Project Name":
            detailsHashMap.put(1, person.getValue());
            break;
    case "Project Type":
            detailsHashMap.put(2, person.getValue());
            break;
    default:
            break;
}

Map<Integer, String> treeMap = new TreeMap<Integer, String>(detailsHashMap);

我总是希望对象按顺序列出

"Project Name" : "Solar Project", "Project Type" : "Government"

注:

i ) 在项目 class 中添加一个额外的整数字段并基于该字段进行排序是一种解决方法,但我无法使用它,因为这些值将在 json 中使用。

ii) 从 Set 更改为 Map 是不可能的,因为需要进行大规模更改

有什么方法可以用 TreeSet 或 Set 的任何实现来实现?

提前致谢

在您的项目中class您需要添加一个覆盖 compareTo 方法的方法,如下所示:

@Override
public int compareTo(String s1, String s2) {
    // ordering logic
}

现在,当您向 TreeMap 添加项目时,它会保持您想要的顺序。

创建 TreeSet 时,将 Comparator 传递给构造函数 - 如

Set<Project> projects = new TreeSet<>(new Comparator<Project>() {
    @Override
    public int compare(Project o1, Project o2) {
        if (o1.getLabel().equals("foo")) return -2;
        if (o1.getLabel().equals("Solar")) return -1;
        if (o1.getLabel().equals("Gov")) return 1;
        return 0;
    }
});

或将 lambda 与 java8

一起使用
Set<Project> projects = new TreeSet<>((o1, o2) -> {
    if (o1.getLabel().equals("foo")) return -2;
    if (o1.getLabel().equals("Solar")) return -1;
    if (o1.getLabel().equals("Gov")) return 1;
    return 0;
});

现在您的值将始终按照比较器中的设置进行排序:

public class FooTestApplication {

    public static void main(String[] args) {
        Project p = new Project();
        p.setLabel("Solar");
        p.setValue("foo");
        Project p2 = new Project();
        p2.setLabel("Gov");
        p2.setValue("foo2");
        Project p3 = new Project();
        p3.setLabel("foo");
        p3.setValue("foo3");
        Set<Project> projects = new TreeSet<>((o1, o2) -> {
            if (o1.getLabel().equals("foo")) return -2;
            if (o1.getLabel().equals("Solar")) return -1;
            if (o1.getLabel().equals("Gov")) return 1;
            return 0;
        });
        projects.add(p);
        projects.add(p2);
        projects.add(p3);

        projects.iterator().forEachRemaining(pp -> {
            System.out.println(pp.getLabel());
        });
    }
}

输出:

foo
Solar
Gov