java - 使用比较器对 map 进行排序

标签 java sorting map comparator

我正在尝试 Comparator 根据序列在 TreeMap 中实现排序。

    final String sequence="People,Object,Environment,Message,Service";
Comparator<String> comparator = new Comparator<String>() {
             @Override
             public int compare(String key1, String key2) {
                 int returned = sequence.indexOf(key1) - sequence.indexOf(key2);

                 if (returned == 0 && !key1.contains(key2))
                     returned = -1;

                 return returned;

             }
         };
List<String> list=new ArrayList<String>();
          Map<String,String> lhm = new TreeMap<String,String>(comparator);
       // Put elements to the map
          lhm.put("Object", "biu");
          lhm.put("Message", "nuios");
          lhm.put("Service", "sdfe");
          lhm.put("People", "dfdfh");
          lhm.put("Environment", "qwe");
          lhm.put("Other", "names");
          lhm.put("Elements", "ioup");          
          lhm.put("Rand", "uiy");
for(Entry<String, String> entry : lhm.entrySet()) {
                System.out.println(entry.getKey());
            }

我在这里得到的输出是

Rand
Elements
Other
People
Object
Environment
Message
Service

TreeMap 中等于序列的元素排序正确,但其他不在序列后面的元素应该在序列之后。我的期望如下

People
Object
Environment
Message
Service
Rand
Elements
Other

如何实现?

假设如果我向 TreeMap 的元素添加更多单词意味着我的比较器甚至不对元素进行排序。像这样

lhm.put("Object IOn", "biu");
          lhm.put("Message dfb", "nuios");
          lhm.put("Serviceabc", "sdfe");
          lhm.put("Peoplexxx", "dfdfh");
          lhm.put("Environmentxxx", "qwe");
          lhm.put("Other", "names");
          lhm.put("Elements", "ioup");          
          lhm.put("Rand", "uiy");

我的输出变成

Rand
Elements
Other
Environmentxxx
Peoplexxx
Serviceabc
Message dfb
Object IOn

有人帮我重写我的比较器来解决这个问题吗?

最佳答案

这里有一些简单的代码可以完成任务。

import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;

public class FixedOrderComparator implements Comparator<String> {

  private final Map<String, Integer> index = new HashMap<>();

  public FixedOrderComparator(String elements) {
    String[] split = elements.split(",");
    for (int i = 0; i < split.length; i++) {
      index.put(split[i], i);
    }
  }

  @Override
  public int compare(String left, String right) {
    Integer rankLeft = index.get(left);
    Integer rankRight = index.get(right);
    if (rankLeft != null && rankRight != null) {
      return rankLeft.compareTo(rankRight);
    }
    if (rankLeft == null && rankRight == null) {
      return left.compareTo(right);
    }
    return Boolean.compare(rankLeft == null, rankRight == null);
  }

}

关于java - 使用比较器对 map 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18720800/

相关文章:

JavaFX:Javafx 应用程序的全局菜单在切换应用程序之前在 MACOS 10.15 Catalina 上无响应

javascript - 如何使用forEach循环javascript对对象数组进行排序

javascript - JavaScript 中的排序

algorithm - 我如何根据远亲的种子从其他人的家谱中推断出最亲近的亲戚?

php - 如何通过在我的服务器上离线进行计算来获得距离矩阵

java - Apache Commons CLI DefaultParser NoSuchMethod 错误

java - 在Calendar Java中将字符串解析为TimeZone ICT

java - 我可以在 J2ME 中使用 HashMap 吗?

java - 我正在尝试解析 XML 文件,但在修复收到的错误时遇到一些问题

java - 使用插入顺序作为顺序的 java.util.Map 的实现