【问题标题】:Sort a list in java into a specific order将java中的列表排序为特定顺序
【发布时间】:2020-09-28 03:16:21
【问题描述】:

为 List 实现自定义排序的最佳方法是什么?

我有下面的常量列表。

ENERGY_POLICY, OBJECTIVE, TRAINING, SEU_REPORT, ENERGY_PERFORMANCE, INTERNAL_AND_EXTERNAL_PARTIES, INTERNAL_AUDIT_REVIEW, LEGAL_REQUIREMENTS_REVIEW, TASKS_REVIEW, CORRECTIVE_ACTIONS

我想实现一个排序功能,按如下所示的特定顺序对它们进行排序。

[OBJECTIVE, ENERGY_POLICY, TRAINING, ENERGY_PERFORMANCE, INTERNAL_AUDIT_REVIEW, LEGAL_REQUIREMENTS_REVIEW, TASKS_REVIEW, SEU_REPORT, CORRECTIVE_ACTIONS, INTERNAL_AND_EXTERNAL_PARTIES]

任何帮助我指出正确的方向将不胜感激。

【问题讨论】:

  • 我们怎么知道,例如,OBJECTIVE 应该排在ENERGY_POLICY 之前,而CORRECTIVE_ACTIONS 应该排在它们之后?
  • 请显示一些代码。这些常数是什么?它们是枚举吗?文件中的字符串?静态变量名? // 他们是如何“进来”的? // 你试图编程什么,你卡在哪里了?

标签: java string list sorting


【解决方案1】:

您可以将每个常量放在哈希映射中,以常量为键,位置为值。

现在,当您收到常量时,从哈希图中获取它应该位于的位置,并基于它创建最终列表

【讨论】:

    【解决方案2】:

    你可以试试这样的

    
            List<String> strings = Arrays.asList("OBJECTIVE", "ENERGY_POLICY", "TRAINING", "ENERGY_PERFORMANCE", "INTERNAL_AUDIT_REVIEW",  "LEGAL_REQUIREMENTS_REVIEW", "TASKS_REVIEW, SEU_REPORT", "CORRECTIVE_ACTIONS", "INTERNAL_AND_EXTERNAL_PARTIES");
    
            Map<String, Integer> ranks = new HashMap<>();
    
            // Assign rank to each element and store in ranks map. This map will be used for retrieving rank of each element while defining custom sorter
            for (int i =0 ; i< strings.size() ; i++) {
                ranks.put(strings.get(i),i);
            }
    
            // Now lets take a list which needs to sorted based on above order
            List<String> stringsToBeSorted  = Arrays.asList("ENERGY_POLICY", "OBJECTIVE", "TRAINING", "SEU_REPORT", "ENERGY_PERFORMANCE", "INTERNAL_AND_EXTERNAL_PARTIES", "INTERNAL_AUDIT_REVIEW", "LEGAL_REQUIREMENTS_REVIEW", "TASKS_REVIEW", "CORRECTIVE_ACTIONS");
    
            stringsToBeSorted.sort(new Comparator<String>() {
                @Override
                public int compare(String str1, String str2) {
                    if (ranks.get(str1) == null || ranks.get(str2) == null) {
                        return 0;
                    }
    
                    return ranks.get(str1) - ranks.get(str2);
                }
            });
    
    
    

    或使用 Java 8

            stringsToBeSorted.sort(Comparator.comparingInt(ranks::get));  
    

    但您需要确保 strings 具有所有值,并且 stringsToBeSorted 列表中不应该存在字符串列表中不存在的值。因为它会抛出空指针异常,因为它从 hashmap 中检索到的排名是 null

    【讨论】:

      猜你喜欢
      • 2019-07-02
      • 2017-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-04
      • 1970-01-01
      • 2014-01-01
      相关资源
      最近更新 更多