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

时间:2016-10-03 14:30:49

标签: java sorting set treeset

我有一个对象类Project,其属性为label& value。我将对象存储在Set中。问题是我需要根据预定义的标签顺序检索对象属性。我无法理解,如何为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");

我期待的输出是

  

项目名称=太阳能项目,项目类型=政府

但由于它是一个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);

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

  

“项目名称”:“太阳能项目”,“项目类型”:“政府”

注意:

i)在Project类中添加一个额外的整数字段并根据它进行排序是一种变通方法,但是我不能使用它,因为这些值将在json中使用。

ii)由于需要进行大规模的更改,因此无法从“设置”更改为“地图”

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

提前致谢

2 个答案:

答案 0 :(得分:2)

创建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;
    }
});

或者使用带有java8的lambda

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

答案 1 :(得分:0)

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

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

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