【问题标题】:Sorting a list of strings that contains numbers and letters对包含数字和字母的字符串列表进行排序
【发布时间】:2021-02-22 11:07:20
【问题描述】:

我正在尝试对字符串列表进行排序。字符串包含用户名和他们的杀戮。我想使用用户名和 - 之前的杀戮次数对列表进行排序。我已经阅读了 Comparator 并尝试了一些但没有任何运气。

public class Test {
    public static List<String> TOP10_Players = new ArrayList<>();
    
    public static void AddPlayers() {
        // TOP10_Players.add("[Kills]-[Username]");
        TOP10_Players.add("1-Username1");
        TOP10_Players.add("2-Username2");
        TOP10_Players.add("3-Username3");
        
        SortList();
    }
    
    public static void SortList() {
        // Code to sort list
    }
}

【问题讨论】:

  • 所以...你尝试了什么?基本上,它只是字符串上的 compareTo
  • 如果您有 1-user1 和 10-user2(因为 10-user2 是第一个),strings 上的compareTo 不起作用。

标签: java arrays list sorting bukkit


【解决方案1】:

我建议一步一步来:

  1. 创建带有 id 和 kills 的地图,
  2. 使用来自following topic 的建议对该地图进行排序,
  3. 将键保存到 ArrayList,

例如(草稿,不检查):

public static void SortList() {
    Map<String, Value> map = new HashMap();
    for(String playerAndKill: TOP10_Players) {
        String parts = playerAndKill.split('-');
        int kills = Integer.parseInt(parts[0]);
        map.put(playerAndKill, kills); 
    }
    TOP10_Players = sortByValue(map).keySet();
}


public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> map) {
    List<Entry<K, V>> list = new ArrayList<>(map.entrySet());
    list.sort(Entry.comparingByValue());

    Map<K, V> result = new LinkedHashMap<>();
    for (Entry<K, V> entry : list) {
        result.put(entry.getKey(), entry.getValue());
    }

    return result;
}

【讨论】:

    【解决方案2】:

    您可以使用 Comparator 来做到这一点。使用 split("-") 将在找到“-”的位置分隔一个字符串并返回一个 String[]。然后在 Integer.parseInt(((String) o).split("-")[0])) 的帮助下,它将第一个拆分的 String 项转换为 Integer,Comparator 可以对列表进行相应的排序。

    TOP10_Players.sort(Comparator.comparing((Object o) -> Integer.parseInt(((String) o).split("-")[0])));
    

    输出:[1-Username1, 3-Username3, 5-Username2]

    降序:

    TOP10_Players.sort(Comparator.comparing((Object o) -> Integer.parseInt(((String) o).split("-")[0])).reversed());
    

    输出:[5-Username2, 3-Username3, 1-Username1]

    【讨论】:

      猜你喜欢
      • 2022-11-23
      • 2016-10-28
      • 2021-08-12
      • 2012-08-07
      • 2019-03-28
      • 1970-01-01
      • 1970-01-01
      • 2022-11-24
      相关资源
      最近更新 更多