如何按照自定义顺序对一个字符串数组进行排序?

4

我在Java中有一个字符串数组,这些字符串是从一个Excel文件中读取的,其中订单每次都会变化:

//This is an example of users list  
String[] usersList = ["Printers", "Configuration","Admin", "Service Desk", "Event Manager"]

我想按照自定义的顺序对字符串数组进行排序,如下所示:
private final String[] userSortOrder = ["Admin","Printers","Configurations","Event Manager","Service Desk"]

我该如何将排序应用到我的字符串数组userList中?


通过重写比较器的比较函数并在sort()中传递它来排序。 - Beshambher Chaukhwan
3个回答

1
您只需要使用Java Utils Array中的sort方法,提供一个比较器对象,该对象具有一个compare方法,应返回: - 如果第一个对象在第二个对象之下,则为负数 - 如果第一个对象在第二个对象之上,则为正数 - 如果两个对象相等,则为0 ,如下所示:
Arrays.sort(sorted, new Comparator<String>() {
public int compare(String o1, String o2) {
    int result = 0;
    // Ordering algorithm here
    return result;
}});

0
使用重载的 Arrays.sort 函数,该函数将实现 Comparator<T> 作为第二个参数。 实现 Comparator<String> 接口以实现自定义比较。

我使用了一个 HashMap 来为每个条目分配权重/优先级,然后使用此优先级进行比较。具有更高优先级的对象将被视为更大。您可以通过更改 map.put() 的第二个参数来自定义优先级。 Comparator<T> 接口的 compare 函数工作方式是,对于任何两个对象,如果:

  • 返回的 int 为负数,则第二个元素较大
  • 返回的 int 为0,则两个元素相等
  • 返回的 int 为正数,则第一个元素较大
class CustomComparator implements Comparator<String>
{
    HashMap<String, Integer> map;
    
    public CustomComparator()
    {
        map = new HashMap<>();
        map.put("Admin", 1); 
        map.put("Printers", 2);
        map.put("Configuration", 3);
        map.put("Event Manager", 4);
        map.put("Service Desk", 5);
    }
    
    public int compare(String s1, String s2) {
        return map.get(s1) - map.get(s2);
    }
}

class Main {
     public static void main(String []args){
        System.out.println("Hello World");
        String[] usersList = {"Printers", "Configuration","Admin", "Service Desk", "Event Manager"};
        System.out.println("Before sorting: ");
        Arrays.toString(usersList);
        Arrays.sort(usersList, new CustomComparator());
        System.out.println("After sorting: ");
        Arrays.toString(usersList);
     }  
}

鉴于 Comparator<T> 是一个功能接口,因此您也可以使用 lambda 表达式在同一函数中定义映射:

HashMap<String, Integer> map = new HashMap<>();
map.put("Admin", 1);
map.put("Printers", 2);
map.put("Configuration", 3);
map.put("Event Manager", 4);
map.put("Service Desk", 5);
            
Arrays.sort(usersList, (s1, s2) -> map.get(s1) - map.get(s2));

System.out.println("After sorting:");

Arrays.toString(usersList);

0

我建议使用 Map 来存储这些 String 的顺序,然后使用自定义的 Comparator 进行排序。

HashMap<String, Integer> orderMap = new HashMap<>();
for (int i = 0; i < userSortOrder.length; i++)
    orderMap.put(userSortOrder[i], i);
Arrays.sort(usersList, (a, b) -> orderMap.get(a) - orderMap.get(b));

请注意,您必须确保userList中的每个StringorderMap中都有自己的顺序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接