根据特定的预定义顺序对 TreeSet 中的对象进行排序
Sorting objects in a TreeSet based on a particular predefined order
我有一个对象 class,Project
具有属性 label
和 value
。我将对象存储在一个集合中。问题是我需要根据预定义的标签顺序检索对象属性。我无法理解如何为 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
我有一个对象 class,Project
具有属性 label
和 value
。我将对象存储在一个集合中。问题是我需要根据预定义的标签顺序检索对象属性。我无法理解如何为 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