【问题标题】:Sorting Strings with 2 keys [closed]用 2 个键对字符串进行排序 [关闭]
【发布时间】:2013-11-17 13:28:46
【问题描述】:

所以,我需要根据 Java 中的两个键对字符串进行排序。

我得到包含名称的原始文本输入,如下所示:city_name person_name

目标主要是按字母顺序对城市进行排序,其次是人名。然后它需要显示该城市有多少具有该特定名称的人。

所以,输入为:

C Zeke
A John
C Pete
B Lisa
A John
B John
C Pete
C Pete
B Lisa

需要输出

A John 2
B John 1
B Lisa 2
C Pete 3
C Zeke 1

这让我彻底傻眼了。有什么想法吗?

【问题讨论】:

  • 您的类是否实现了 Comparable 接口?如果是这样,那么只需编写 compareTo 方法来首先比较主键字段持有的数据,如果它们相等(并且如果两个主键字段相等)比较辅助键字段。就是这样。
  • “这个问题显示了研究工作;它有用且清晰”。没有。

标签: java string sorting


【解决方案1】:

假设您有一个包含person_namecity_name 的类Person,只需将它们放入List 并使用Collections.sort(List, Comparator) 使用自定义Comparator 实现对它们进行排序,该实现首先检查城市然后是名字:

Collections.sort(people, new Comparator<Person>() {
    compare(Person p1, Person p2) {
        int c = p1.getCity().compareTo(p2.getCity());
        return (c == 0) ? p1.getName().compareTo(p2.getName()) : c;
    }
});

请注意,您可能必须添加null 检查。也可以考虑通过compareToIgnoreCase 比较字符串。

【讨论】:

    【解决方案2】:

    只是根据cmets编辑的。 MultiKeyMap 不是 JDK 的一部分 :(。

    您可以使用MultiKeyMapMap&lt;String,Integer&gt; 并将城市和名称存储为键,并将遭遇次数存储为值。然后您只需遍历地图的条目并打印值

    Map<String,Integer> map = new HashMap<String,Integer>();
    
    for ( String cityAndName : input ) { 
       String city = // split and get city
       String name = // split and get name
       Integer noOfEncounters = 0;
       if ( map.containsKey(city+"_"+name) ) { 
            noOfEncounters = map.get(city+"_"+name);
            noOfEncounters++;
       }
       map.put(city+"_"+name,noOfEncounters);
    }
    

    如果你有一个包含城市和名称的对象会更好。像人这样的东西。然后,您只需覆盖要针对 cityname 属性计算的 hashcode 和 equals 方法,并且您不需要进行那种丑陋的连接。

    【讨论】:

    • 这不是 JDK 的一部分。
    • 谢谢,这帮助了我。原来我只是个白痴,想得太难了。
    猜你喜欢
    • 2022-08-21
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多