有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将列表拆分为组

我有一个字符串列表,我想知道是否有一种简单的方法可以将大小为n的组中的元素连接起来,如果小于n,最后的元素将自动处理。例如

String[] strings = {"A", "man", "a", "plan", "a", "canal", "Panama"};

n=3的预期输出为以下字符串列表。记住,我可以使用一些令人精疲力竭的迭代来自己完成这项工作,但我正在寻找一些简单的方法。也许是标准库内置的东西

String[] output = {"A man a", "plan a canal", "Panama"};

作为比较,我想用Python演示任务的简单性。我正在寻找一个同样简单的Java解决方案

[' '.join(strings[i:i+3]) for i in range(0, len(strings), 3)]

共 (2) 个答案

  1. # 1 楼答案

    我不知道这方面的库,但这个方法很容易编写:

        public static String[] group(int groupsize, String separator, String[] strings) {
    
        List<String> output = new ArrayList<>();
        StringBuilder sb = new StringBuilder();
    
        int index = 0;
    
        for (String string : strings) {
    
            if (index > 0) {
                sb.append(separator);
            }
    
            sb.append(string);
    
            index++;
    
            if (index >= groupsize) {
                index = 0;
                output.add(sb.toString());
                sb = new StringBuilder();
            }
        }
    
        if(index > 0) {
            output.add(sb.toString());
        }
    
        return output.toArray(new String[output.size()]);
    }
    

    您也可以使用番石榴进行分割和连接,但是对于这种简单的过程,上面的方法似乎很容易理解

    此外,Guava需要在字符串数组上迭代2次:一次用于分区,另一次用于连接。因此,使用番石榴的效率应该更低

  2. # 2 楼答案

    • Guava——谷歌的Java实用程序库,有一个partition方法列表。分区(列表、大小),可用于将列表拆分为3组
    • Java8有字符串。加入(分隔符,iterable)或番石榴Joiner.join()
    • 像列表这样的集合通常比原始数组更好使用

    例如,假设你没有食用番石榴

    public static void main(String[] args) {
        String[] strings = { "A", "man", "a", "plan", "a", "canal", "Panama" };
    
        List<String> output = new ArrayList<String>();
        for (List<String> partition : partition(Arrays.asList(strings), 3)) {
            output.add(String.join(" ", partition));
        }
        System.out.println(Arrays.toString(output.toArray()));
    }
    
    private static <T> List<List<T>> partition(List<T> input, int size) {
        List<List<T>> lists = new ArrayList<List<T>>();
        for (int i = 0; i < input.size(); i += size) {
            lists.add(input.subList(i, Math.min(input.size(), i + size)));
        }
        return lists;
    }