根据java中的字母表将按字母顺序排序的列表拆分为子列表

根据java中的字母表将按字母顺序排序的列表拆分为子列表,java,list,Java,List,我在java中有一个排序列表,我只想根据列表每个索引的第一个字母表将这个列表拆分为子列表。例如 列表包含 { calculator, catch, doll, elephant } 我希望子列表为 {calculator,catch} {doll} {elephant} 我不想把26条if语句放在这里,有没有有效和正确的方法呢。列表已按字母顺序排序。 非常感谢您的帮助。您可以使用Java8流。不幸的是,此方法没有利用正在排序的列表列表必须是包含元素的列表 Map<Character,

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

{
calculator,
catch,
doll,
elephant
}
我希望子列表为

{calculator,catch}
{doll}
{elephant}
我不想把26条if语句放在这里,有没有有效和正确的方法呢。列表已按字母顺序排序。
非常感谢您的帮助。

您可以使用Java8流。不幸的是,此方法没有利用正在排序的列表<代码>列表必须是包含元素的列表

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

类似的方法可能会奏效

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;
}
private List subListOnFirstLetter(列表列表){
列表结果=新建ArrayList();
charfirst=list.get(0).charAt(0);
列表子列表=新的ArrayList();
for(字符串元素:列表){
char next=element.charAt(0);
如果(下一个!=第一个){
结果.添加(子列表);
subList=新的ArrayList();
}否则{
子列表。添加(元素);
}
第一个=下一个;
}
返回结果;
}

对于Java-8,@SilverNak的解决方案很好,如果您不使用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);
        }
    }
}
publicstaticvoidmain(字符串[]args){
字符串列表[]={“计算器”、“捕获”、“娃娃”、“大象”};
Map Map=newhashmap();
列表lst;
for(字符串str:list){
//如果键退出,则将str添加到列表中,否则添加新元素
if(map.containsKey(str.charAt(0))){
map.get(str.charAt(0)).add(str);
}否则{
lst=新的ArrayList();
第一次添加(str);
地图放置(str.charAt(0),lst);
}
}
}

如果您愿意使用第三方库,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]}

注意:我是Eclipse集合的提交者。

您不必输入26条if语句。只要跟踪单词的第一个字母的变化就可以了。我试着在纸上写一些逻辑,但还不够好@anandudavia,这就是为什么我在寻找一些可靠有效的方法。list.Stream和collector没有定义,我使用的是jdk 1.6,无法升级到jdk 1.8,因为myEclipse有JDK1.7的max选项。更新eclipse是一个解决方案吗?我不能更新eclipse,我必须在那个环境中工作。抱歉:(,jdk 1.6有什么解决方案吗?如果你从那里得到了列表,就不需要把它放回映射中,它已经在那里了。谢谢@OleV.V。我已经更改了它,但我不知道还有什么其他方法吗?如果使用Java 8,你可以使用
ComputeFabSent();但问题是,我们在早期的java版本中做了什么?我认为你的代码很好。我可能先做<代码> GET()/Cuff>。如果我创建NULL,请创建<代码> ARARYLIST//CUT>并将其放入(不需要<代码> E/SCOR>部分)。最后无条件地将字符串添加到列表中。相同的行数,这是一个味觉的问题。
List<String> list =
        Arrays.asList("calculator", "catch", "doll", "elephant");
Multimap<Character, String> multimap =
        ListAdapter.adapt(list).groupBy(StringFunctions.firstLetter());