根据具有特殊条件的多个字段对对象列表进行排序
Sorting List of Objects based on multiple fields with Special Criteria
我正在尝试根据两个字段 [名称、旧名称] 以升序对对象列表进行排序,其中 Name 字段值可以是破折号(“-”),如果名称是破折号,那么它将被添加到列表的末尾。 [像下面的顺序:名称:旧名称]
SENSITIVE: COMP Operations: COMP Operations
SENSITIVE: Court procedural documents: Court procedural documents
SENSITIVE: Staff matter: Staff Matter
SPECIAL HANDLING: ETS Critical: ETS Critical
-: ETS Limited
-: EU Satellite Navigation matters
-: Limited ETS Joint Procurement
到目前为止我得到了以下结果:
-: ETS Limited
-: EU Satellite Navigation matters
-: Limited ETS Joint Procurement
SENSITIVE: COMP Operations: COMP Operations
SENSITIVE: Court procedural documents: Court procedural documents
SENSITIVE: Staff matter: Staff Matter
SPECIAL HANDLING: ETS Critical: ETS Critical
领域模型:
class Marking {
String name;
String oldName;
public Marking(String name, String oldName) {
this.name = name;
this.oldName = oldName;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getOldName() {
return oldName;
}
public void setOldName(String oldName) {
this.oldName = oldName;
}
@Override
public String toString() {
return "Marking [name=" + name + ", oldName=" + oldName + "]";
}
}
和解决方案Class:
public class Solution {
public static void main(String[] args) {
List<Marking> markings = new ArrayList<>();
markings.add(new Marking("-", "Limited ETS Joint Procurement"));
markings.add(new Marking("-", "EU Satellite Navigation matters"));
markings.add(new Marking("SENSITIVE: Court procedural documents", "Court procedural documents"));
markings.add(new Marking("SENSITIVE: COMP Operations", "COMP Operations"));
markings.add(new Marking("-", "ETS Limited"));
markings.add(new Marking("SENSITIVE: Staff matter", "Staff Matter"));
markings.add(new Marking("SPECIAL HANDLING: ETS Critical", "ETS Critical"));
Collections.sort(markings, new Comparator<Marking>() {
@Override
public int compare(Marking o1, Marking o2) {
int value = o1.getName().compareToIgnoreCase(o2.getName());
if(value == 0) {
return o1.getOldName().compareToIgnoreCase(o2.getOldName());
}
return value;
}
});
for (Marking marking : markings) {
System.out.println(marking.getName() + ": " + marking.getOldName());
}
}
}
任何人都可以给我一些建议,我怎样才能将破折号名称对象添加到列表的末尾,其中旧名称应按升序排列。
这是一个建议。顺序是 fine,我们所做的就是取出所有以“-”开头的元素并将它们从列表中删除,然后在末尾添加回来。这是低效的,但它是一种决心。
public static void main(String[] args) {
List<Marking> markings = new ArrayList<>();
markings.add(new Marking("-", "Limited ETS Joint Procurement"));
markings.add(new Marking("-", "EU Satellite Navigation matters"));
markings.add(new Marking("SENSITIVE: Court procedural documents", "Court procedural documents"));
markings.add(new Marking("SENSITIVE: COMP Operations", "COMP Operations"));
markings.add(new Marking("-", "ETS Limited"));
markings.add(new Marking("SENSITIVE: Staff matter", "Staff Matter"));
markings.add(new Marking("SPECIAL HANDLING: ETS Critical", "ETS Critical"));
markings.sort((o1, o2) -> {
int value = o1.getName().compareToIgnoreCase(o2.getName());
if (value == 0) {
return o1.getOldName().compareToIgnoreCase(o2.getOldName());
}
return value;
});
List<Marking> dashed = markings.stream().filter(marking -> marking.name.startsWith("-") || marking.oldName.startsWith("-"))
.collect(Collectors.toList());
markings.removeAll(dashed);
markings.addAll(dashed);
for (Marking marking : markings) {
System.out.println(marking.getName() + ": " + marking.getOldName());
}
}
这是我很快想到的一个选项:
Collections.sort(markings, (o1, o2) -> {
int value = o1.getName().compareToIgnoreCase(o2.getName());
if(value == 0) {
return o1.getOldName().compareToIgnoreCase(o2.getOldName());
}
if(o1.getName().equals("-")) {
return 1;
}
if(o2.getName().equals("-")) {
return -1;
}
return value;
});
我正在尝试根据两个字段 [名称、旧名称] 以升序对对象列表进行排序,其中 Name 字段值可以是破折号(“-”),如果名称是破折号,那么它将被添加到列表的末尾。 [像下面的顺序:名称:旧名称]
SENSITIVE: COMP Operations: COMP Operations
SENSITIVE: Court procedural documents: Court procedural documents
SENSITIVE: Staff matter: Staff Matter
SPECIAL HANDLING: ETS Critical: ETS Critical
-: ETS Limited
-: EU Satellite Navigation matters
-: Limited ETS Joint Procurement
到目前为止我得到了以下结果:
-: ETS Limited
-: EU Satellite Navigation matters
-: Limited ETS Joint Procurement
SENSITIVE: COMP Operations: COMP Operations
SENSITIVE: Court procedural documents: Court procedural documents
SENSITIVE: Staff matter: Staff Matter
SPECIAL HANDLING: ETS Critical: ETS Critical
领域模型:
class Marking {
String name;
String oldName;
public Marking(String name, String oldName) {
this.name = name;
this.oldName = oldName;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getOldName() {
return oldName;
}
public void setOldName(String oldName) {
this.oldName = oldName;
}
@Override
public String toString() {
return "Marking [name=" + name + ", oldName=" + oldName + "]";
}
}
和解决方案Class:
public class Solution {
public static void main(String[] args) {
List<Marking> markings = new ArrayList<>();
markings.add(new Marking("-", "Limited ETS Joint Procurement"));
markings.add(new Marking("-", "EU Satellite Navigation matters"));
markings.add(new Marking("SENSITIVE: Court procedural documents", "Court procedural documents"));
markings.add(new Marking("SENSITIVE: COMP Operations", "COMP Operations"));
markings.add(new Marking("-", "ETS Limited"));
markings.add(new Marking("SENSITIVE: Staff matter", "Staff Matter"));
markings.add(new Marking("SPECIAL HANDLING: ETS Critical", "ETS Critical"));
Collections.sort(markings, new Comparator<Marking>() {
@Override
public int compare(Marking o1, Marking o2) {
int value = o1.getName().compareToIgnoreCase(o2.getName());
if(value == 0) {
return o1.getOldName().compareToIgnoreCase(o2.getOldName());
}
return value;
}
});
for (Marking marking : markings) {
System.out.println(marking.getName() + ": " + marking.getOldName());
}
}
}
任何人都可以给我一些建议,我怎样才能将破折号名称对象添加到列表的末尾,其中旧名称应按升序排列。
这是一个建议。顺序是 fine,我们所做的就是取出所有以“-”开头的元素并将它们从列表中删除,然后在末尾添加回来。这是低效的,但它是一种决心。
public static void main(String[] args) {
List<Marking> markings = new ArrayList<>();
markings.add(new Marking("-", "Limited ETS Joint Procurement"));
markings.add(new Marking("-", "EU Satellite Navigation matters"));
markings.add(new Marking("SENSITIVE: Court procedural documents", "Court procedural documents"));
markings.add(new Marking("SENSITIVE: COMP Operations", "COMP Operations"));
markings.add(new Marking("-", "ETS Limited"));
markings.add(new Marking("SENSITIVE: Staff matter", "Staff Matter"));
markings.add(new Marking("SPECIAL HANDLING: ETS Critical", "ETS Critical"));
markings.sort((o1, o2) -> {
int value = o1.getName().compareToIgnoreCase(o2.getName());
if (value == 0) {
return o1.getOldName().compareToIgnoreCase(o2.getOldName());
}
return value;
});
List<Marking> dashed = markings.stream().filter(marking -> marking.name.startsWith("-") || marking.oldName.startsWith("-"))
.collect(Collectors.toList());
markings.removeAll(dashed);
markings.addAll(dashed);
for (Marking marking : markings) {
System.out.println(marking.getName() + ": " + marking.getOldName());
}
}
这是我很快想到的一个选项:
Collections.sort(markings, (o1, o2) -> {
int value = o1.getName().compareToIgnoreCase(o2.getName());
if(value == 0) {
return o1.getOldName().compareToIgnoreCase(o2.getOldName());
}
if(o1.getName().equals("-")) {
return 1;
}
if(o2.getName().equals("-")) {
return -1;
}
return value;
});