【问题标题】:Split a alphabetically sorted list into sublists based on alphabets in java根据java中的字母将按字母排序的列表拆分为子列表
【发布时间】:2017-07-30 06:29:13
【问题描述】:

我在 java 中有一个排序列表,我只想根据列表的每个索引处的第一个字母将此列表拆分为子列表。例如 列表包含

{
calculator,
catch,
doll,
elephant
}

我希望子列表为

{calculator,catch}
{doll}
{elephant}

我不想放 26 个 if 语句,是否有任何有效且正确的方法来执行此操作。该列表已按字母顺序排序。 任何帮助将不胜感激。

【问题讨论】:

  • 您不必放置 26 个 if 语句。只需在单词的第一个字母发生变化时跟踪即可。
  • 我试图在纸上做一些逻辑,但它不够好@AnandUndavia,这就是为什么我正在寻找一些可靠和有效的方法。

标签: java list


【解决方案1】:

您可以使用 Java 8 流。不幸的是,这种方法没有利用已经排序的列表。 list 必须是包含您的元素的列表。

Map<Character, List<String>> collect =
        list.stream().collect(Collectors.groupingBy(elem -> elem.charAt(0)));

【讨论】:

  • list.Stream 和 Collectors 未定义,我正在使用 jdk 1.6 并且无法升级到 jdk 1.8,因为 myEclipse 具有 jdk 1.7 的最大选项。
  • 更新 eclipse 可以解决吗?
  • 我无法更新 Eclipse,我必须在那个环境中工作。抱歉 :(,jdk 1.6 有什么解决方案吗?
【解决方案2】:

这样的事情可能会奏效。

private List<List<String>> subListOnFirstLetter(List<String> list) {
    List<List<String>> result = new ArrayList<>();
    char first = list.get(0).charAt(0);
    List<String> subList = new ArrayList<>();
    for (String element : list) {
        char next = element.charAt(0);
        if (next != first) {
            result.add(subList);
            subList = new ArrayList<>();
        } else {
            subList.add(element);
        }
        first = next;
    }
    return result;
}

【讨论】:

    【解决方案3】:

    @SilverNak 的解决方案适用于 Java-8,如果您不使用 Java-8,也可以使用它:

    public static void main(String[] args) {
        String list[] = {"calculator", "catch", "doll", "elephant"};
        Map<Character, List<String>> map = new HashMap<>();
    
        List<String> lst;
        for (String str : list) {
            //if the key exit then add str to your list else add a new element
            if (map.containsKey(str.charAt(0))) {
                map.get(str.charAt(0)).add(str);
            } else {
                lst = new ArrayList<>();
                lst.add(str);
                map.put(str.charAt(0), lst);
            }
        }
    }
    

    【讨论】:

    • 如果您从那里获得列表,则无需将其放回地图中,它已经在那里了。
    • 谢谢@OleV.V。我已经改了,但我不关心,还有其他方法吗?
    • 如果使用Java 8,你可以使用computeIfAbsent();但问题是,我们在早期的 Java 版本中做什么?我认为你的代码很好。我可能会先做get()。如果我得到 null,请创建 ArrayList 并将其放入(不需要 else 部分)。最后无条件地将字符串添加到列表中。行数相同,所以这是一个品味问题。
    【解决方案4】:

    如果您愿意使用第三方库,Eclipse Collections 7.x 将适用于 Java 6。使用 Eclipse Collections MutableList 您可以调用groupBy,如下所示:

    MutableList<String> list = 
            Lists.mutable.with("calculator", "catch", "doll", "elephant");
    Multimap<Character, String> multimap = 
            list.groupBy(StringFunctions.firstLetter());
    System.out.println(multimap); 
    // Prints {d=[doll], e=[elephant], c=[calculator, catch]}
    

    如果您需要为字符串使用java.util.List,那么您可以使用ListAdapter 类。

    List<String> list =
            Arrays.asList("calculator", "catch", "doll", "elephant");
    Multimap<Character, String> multimap =
            ListAdapter.adapt(list).groupBy(StringFunctions.firstLetter());
    

    注意:我是 Eclipse Collections 的提交者。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-19
      • 2023-03-11
      • 1970-01-01
      • 2015-02-05
      • 2018-09-15
      • 2012-08-12
      相关资源
      最近更新 更多