将 arraylist 拆分为单独的数组,每第 3 个元素是下一个元素的第一个元素
Splitting arraylist into seperate arrays with every 3rd element being the 1st element of the next
我试图将数组列表拆分成单独的数组以获得 "edges"。我需要将 arraylist 拆分为大小为 3 的数组,新拆分创建的数组的第三个元素是下一个数组的第一个元素。我目前所做的是,尽管第 3 个元素不是下一个元素的第一个元素,但 arraylist 已成功拆分为 3 个数组。
示例:[1,2,3,4,5,6,7] 需要拆分为 [1,2,3],[3,4,5],[5,6, 7] 但我得到的是 [1,2,3],[4,5,6],[7]
这是我使用的代码:
for(ArrayList<String> path : allPaths) {
edges = separate(path, 3);
}
for(List<String> edge : edges){
System.out.println("Edge: "+edge);
}
然后访问这个方法
static <T> List<List<T>> separate (List<T> path, final int size){
List<List<T>> separated = new ArrayList<>();
for(int i = 0; i < path.size(); i+= size){
separated.add(new ArrayList<>(path.subList(i, Math.min(path.size(), i + size))));
}
return separated;
}
按如下操作:
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> list = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9);
System.out.println(separate(list, 3));
}
static <T> List<List<T>> separate(List<T> path, final int size) {
List<List<T>> separated = new ArrayList<>();
List<T> temp;
for (int i = 0; i < path.size(); i += size - 1) {
temp = (List<T>) path.subList(i, Math.min(path.size(), i + size));
if (temp.size() != 1) {
separated.add(new ArrayList<T>(temp));
}
}
return separated;
}
}
输出:
[[1, 2, 3], [3, 4, 5], [5, 6, 7], [7, 8, 9]]
更新
@Mr Mosby - 您发布了关于不将子列表添加到 separated
的附加要求的评论,如果它只有一个元素,因此我更新了上面给出的答案。以防万一您的要求是,当子列表的元素数量少于 size
时,不要将子列表添加到 separated
,下面给出了解决方案:
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> list = List.of(1, 2, 3, 4, 5, 6, 7, 8);
System.out.println(separate(list, 3));
}
static <T> List<List<T>> separate(List<T> path, final int size) {
List<List<T>> separated = new ArrayList<>();
List<T> temp;
for (int i = 0; i < path.size(); i += size - 1) {
temp = (List<T>) path.subList(i, Math.min(path.size(), i + size));
if (temp.size() == size) {
separated.add(new ArrayList<T>(temp));
}
}
return separated;
}
}
输出:
[[1, 2, 3], [3, 4, 5], [5, 6, 7]]
我试图将数组列表拆分成单独的数组以获得 "edges"。我需要将 arraylist 拆分为大小为 3 的数组,新拆分创建的数组的第三个元素是下一个数组的第一个元素。我目前所做的是,尽管第 3 个元素不是下一个元素的第一个元素,但 arraylist 已成功拆分为 3 个数组。
示例:[1,2,3,4,5,6,7] 需要拆分为 [1,2,3],[3,4,5],[5,6, 7] 但我得到的是 [1,2,3],[4,5,6],[7]
这是我使用的代码:
for(ArrayList<String> path : allPaths) {
edges = separate(path, 3);
}
for(List<String> edge : edges){
System.out.println("Edge: "+edge);
}
然后访问这个方法
static <T> List<List<T>> separate (List<T> path, final int size){
List<List<T>> separated = new ArrayList<>();
for(int i = 0; i < path.size(); i+= size){
separated.add(new ArrayList<>(path.subList(i, Math.min(path.size(), i + size))));
}
return separated;
}
按如下操作:
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> list = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9);
System.out.println(separate(list, 3));
}
static <T> List<List<T>> separate(List<T> path, final int size) {
List<List<T>> separated = new ArrayList<>();
List<T> temp;
for (int i = 0; i < path.size(); i += size - 1) {
temp = (List<T>) path.subList(i, Math.min(path.size(), i + size));
if (temp.size() != 1) {
separated.add(new ArrayList<T>(temp));
}
}
return separated;
}
}
输出:
[[1, 2, 3], [3, 4, 5], [5, 6, 7], [7, 8, 9]]
更新
@Mr Mosby - 您发布了关于不将子列表添加到 separated
的附加要求的评论,如果它只有一个元素,因此我更新了上面给出的答案。以防万一您的要求是,当子列表的元素数量少于 size
时,不要将子列表添加到 separated
,下面给出了解决方案:
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> list = List.of(1, 2, 3, 4, 5, 6, 7, 8);
System.out.println(separate(list, 3));
}
static <T> List<List<T>> separate(List<T> path, final int size) {
List<List<T>> separated = new ArrayList<>();
List<T> temp;
for (int i = 0; i < path.size(); i += size - 1) {
temp = (List<T>) path.subList(i, Math.min(path.size(), i + size));
if (temp.size() == size) {
separated.add(new ArrayList<T>(temp));
}
}
return separated;
}
}
输出:
[[1, 2, 3], [3, 4, 5], [5, 6, 7]]