我有一个对象类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的任何实现来实现?
提前致谢
答案 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添加项目时,它将保留您想要的顺序。