使用 Comparator 在列表中向上移动一个元素
Move an element up in the list using Comparator
我在 Java 中有一个 ArrayList
:
{"PatMic", "PatientDoc", "Phram", "Patnet", "PatientA"}
所有元素都分配了一个编号:PatMic = 20,PatientDoc = 30,Phram = 40,Patnet = 50,PatientA = 60。
我现在的比较器:
Comparator<String> comparator = new Comparator<String>() {
@Override
public int compare(final String o1, final String o2) {
final int numbr1 = getElementNumber(); //Returns element's number in a list
final int numbr2 = getElementNumber();
if (numbr1 > numbr2 ) {
return 1;
} else if (numbr1 < numbr2 ) {
return -1;
}
return 0;
}
};
Collections.sort(strings, comparator);
我不想更改分配给每个元素的编号,但想将元素 PatientA 移动到 PatMic 和 PatientDoc 因此修改后的列表应该如下所示:
{"PatMic", "PatientA" "PatientDoc", "Phram", "Patnet"}
有人可以建议如何实现这一目标吗?我尝试了很多方法来修改现有的 Comparator 逻辑,但没有成功。谢谢。
您正在尝试根据与字符串关联的某些固有值进行排序。因此,对 String 本身进行排序可能是不正确的。您可能想要使用的是自定义对象(实现 equals
、hashCode
和接口 Comparable
)或 enum
类型。这将允许您显式更改这些对象的内部状态,这将在使用 Comparator
时自然地表现出来。例如,使用 class:
class MyClass implements Comparable
{
private String name;
private int value;
//Constructor
public MyClass(String s, int v)
{
name = s;
value = v;
}
//Getters and setters
//Implement comparing method
}
然后您可以使用这些对象代替您的字符串:
//...
MyClass patMic = new MyClass("PatMic", 20);
// So on..
首先,您应该让比较器充分了解它应该做什么。我的意思是你应该有一些数据可供比较器使用,比如 "okay, sort them all by associated number except this one - place it right here"。 “就在这里”可以是任何指向确切位置的东西,我会选择“在那个元素之前”。
我们开始吧
public void sortWithException(List<String> data, final Map<String, Integer> numbers, final String element, final String next) {
Collections.sort(data, new Comparator<String>() {
@Override
public int compare(String first, String second) {
if (first.equals(element) || second.equals(element)) { //the exception
Integer nextNumber = numbers.get(next);
Integer firstNumber = numbers.get(first);
Integer secondNumber = numbers.get(second);
if (first.equals(element)) {
if (next == null) // placing the exception after ANY element
return 1;
return secondNumber >= nextNumber ? -1 : 1; //placing the element before next and after all next's predecessors
} else { // second.equals(element)
if (next == null)
return -1;
return firstNumber >= nextNumber ? 1 : -1;
}
} else { //normal sort
return numbers.get(first) - numbers.get(second);
}
}
});
}
并称其为 sortWithException(data, numbers, "PatientA", "PatientDoc")
请注意,我使用 Map 来关联数字,您可能应该使用自己的方法来获取这些数字。
我在 Java 中有一个 ArrayList
:
{"PatMic", "PatientDoc", "Phram", "Patnet", "PatientA"}
所有元素都分配了一个编号:PatMic = 20,PatientDoc = 30,Phram = 40,Patnet = 50,PatientA = 60。
我现在的比较器:
Comparator<String> comparator = new Comparator<String>() {
@Override
public int compare(final String o1, final String o2) {
final int numbr1 = getElementNumber(); //Returns element's number in a list
final int numbr2 = getElementNumber();
if (numbr1 > numbr2 ) {
return 1;
} else if (numbr1 < numbr2 ) {
return -1;
}
return 0;
}
};
Collections.sort(strings, comparator);
我不想更改分配给每个元素的编号,但想将元素 PatientA 移动到 PatMic 和 PatientDoc 因此修改后的列表应该如下所示:
{"PatMic", "PatientA" "PatientDoc", "Phram", "Patnet"}
有人可以建议如何实现这一目标吗?我尝试了很多方法来修改现有的 Comparator 逻辑,但没有成功。谢谢。
您正在尝试根据与字符串关联的某些固有值进行排序。因此,对 String 本身进行排序可能是不正确的。您可能想要使用的是自定义对象(实现 equals
、hashCode
和接口 Comparable
)或 enum
类型。这将允许您显式更改这些对象的内部状态,这将在使用 Comparator
时自然地表现出来。例如,使用 class:
class MyClass implements Comparable
{
private String name;
private int value;
//Constructor
public MyClass(String s, int v)
{
name = s;
value = v;
}
//Getters and setters
//Implement comparing method
}
然后您可以使用这些对象代替您的字符串:
//...
MyClass patMic = new MyClass("PatMic", 20);
// So on..
首先,您应该让比较器充分了解它应该做什么。我的意思是你应该有一些数据可供比较器使用,比如 "okay, sort them all by associated number except this one - place it right here"。 “就在这里”可以是任何指向确切位置的东西,我会选择“在那个元素之前”。
我们开始吧
public void sortWithException(List<String> data, final Map<String, Integer> numbers, final String element, final String next) {
Collections.sort(data, new Comparator<String>() {
@Override
public int compare(String first, String second) {
if (first.equals(element) || second.equals(element)) { //the exception
Integer nextNumber = numbers.get(next);
Integer firstNumber = numbers.get(first);
Integer secondNumber = numbers.get(second);
if (first.equals(element)) {
if (next == null) // placing the exception after ANY element
return 1;
return secondNumber >= nextNumber ? -1 : 1; //placing the element before next and after all next's predecessors
} else { // second.equals(element)
if (next == null)
return -1;
return firstNumber >= nextNumber ? 1 : -1;
}
} else { //normal sort
return numbers.get(first) - numbers.get(second);
}
}
});
}
并称其为 sortWithException(data, numbers, "PatientA", "PatientDoc")
请注意,我使用 Map 来关联数字,您可能应该使用自己的方法来获取这些数字。