我有一个字符串列表,我想知道是否有一种简单的方法来连接大小为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)]
答案 0 :(得分:3)
示例,假设您无法访问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
应该效率低下