Java 使用Comparator结果按照另一个数组(不同长度)对数组进行排序,顺序错误
我需要根据另一个数组对一个数组进行排序,例如: 清单1:[221、54、50、138、125、145] 清单2:[50125] 那么排序后的列表1应该是:[5012522154138145] 我尝试了以下代码:Java 使用Comparator结果按照另一个数组(不同长度)对数组进行排序,顺序错误,java,arrays,sorting,comparator,Java,Arrays,Sorting,Comparator,我需要根据另一个数组对一个数组进行排序,例如: 清单1:[221、54、50、138、125、145] 清单2:[50125] 那么排序后的列表1应该是:[5012522154138145] 我尝试了以下代码: Collections.sort(list1, Comparator.comparing(listItem -> list2.indexOf(listItem))); 但结果是:[221、54、138、145、50、125] 如何才能将50和125放在顶部,其余的放在后面?首先获
Collections.sort(list1, Comparator.comparing(listItem -> list2.indexOf(listItem)));
但结果是:[221、54、138、145、50、125]
如何才能将50和125放在顶部,其余的放在后面?首先获取
list1
项的原因是list2
中不存在的元素的索引返回为-1
,因此它们被放在第一位。您所需要做的只是颠倒顺序,如下所示:
list2.sort(Comparator.reverseOrder());
Collections.sort(list1, Comparator.comparing(listItem -> list2.indexOf(listItem)).reversed());
请注意,在应用反向
之前,需要按反向顺序对列表2
进行排序。如果不想更改排序或list2
,可以克隆list2
,并将其与Comparator
一起使用
演示:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> list1 = new ArrayList<>(List.of(221, 54, 50, 138, 125, 145));
List<Integer> list2 = new ArrayList<>(List.of(50, 125));
// Clone list2
List<Integer> list2Clone = new ArrayList<>(list2);
// Sort the cloned list in reverse order
list2Clone.sort(Comparator.reverseOrder());
// Sort list1
Collections.sort(list1, Comparator.comparing(listItem -> list2Clone.indexOf(listItem)).reversed());
// Display the result
System.out.println(list1);
}
}
[50, 125, 221, 54, 138, 145]
当
list1
元素不包含在list2
中时,则indexOf
返回-1
,这就是为什么这些值首先出现的原因。因此,对于这些值,请使用list1.size()
,然后这些值将稍后出现
Collections.sort(list1, Comparator.comparing(listItem -> list2.contains(listItem) ? list2.indexOf(listItem): list1.size()));
非常感谢,我似乎需要跟进,我将上面的示例设置为通用,但在我的应用程序中,我需要对对象数组和我的旧代码进行排序:
Collections.sort(roomset,Comparator.comparating(room->list.indexOf(room.getId()))代码>工作(导致顺序相反)。但是在添加reversed()函数时,这里有Collections.sort(roomset,Comparator.comparating(room->list.indexOf(room.getId()).reversed())代码>,它突然无法解析该方法。(Id为字符串)。请让我知道,如果你有一个想法,为什么对象的行为是这样的添加反转function@JohnMarkson-我正忙于一些会议,会议结束后我会研究新的要求。只是想确认新的需求:解决方案适用于数字,但您需要一个可以适用于任何类型对象(例如字符串或某个类的对象)的解决方案-这是对您的需求的正确理解吗?也许你可以发布一个新问题以获得更快的响应,这样其他贡献者可以发布一些解决方案,然后我可以在会议结束后再进行研究。哦,感谢你在忙的时候做出响应,但我使用了本文中的另一个答案,另一个用户建议使用三元运算符为List2中不存在的项指定一个高索引值,这太棒了!祝你成功!非常感谢您的回答,我已经把这个问题变成了一般性的问题,但这甚至适用于对数组对象进行排序。