将列表拆分为组

时间:2015-02-23 22:16:11

标签: java python

我有一个字符串列表,我想知道是否有一种简单的方法来连接大小为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 个答案:

答案 0 :(得分:3)

  • Guava - Google的Java实用程序库,有一个partition方法Lists.partition(列表,大小),可用于将列表拆分为3个
  • Java 8具有String.join(separator,iterable)或Guava' Joiner.join()
  • 像列表这样的集合通常比原始数组更好...

示例,假设您无法访问Guava。

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;
}

答案 1 :(得分:0)

我不知道这是一个lib,但这个方法很容易写:

    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 进行分区和连接,但对于这种简单的过程,上面的方法似乎很容易理解。

此外,Guava需要在字符串数组上迭代2次:一次用于分区,另一次用于连接。因此使用Guava

应该效率低下