Split a list into sublists
# Topic
The List interface
# Problem
Split a list into sublists
Implement a method for splitting (partitioning) a generic list into sublists. The method takes two arguments: a generic list and a size of sublists. The specified size of sublists can be greater than the size of the given list.
Each sublist except the last one must have the specified size. The last sublist can have a smaller number of elements.
Example 1
- the input list: [1, 2, 3, 4, 5, 6, 7]
- the specified size of sublists: 4
- the expected result: [[1, 2, 3, 4], [5, 6, 7]]
Example 2
- the input list: [7, 4, 3, 2, 8, 1]
- the specified size of sublists: 8
- the expected result: [[7, 4, 3, 2, 8, 1]]
Example 3
- the input list: [10, 12, 12, 13, 13, 45, 12, 19, 34, 12, 588, 12, 34, 12]
- the specified size of sublists: 5
- the expected result: [[10, 12, 12, 13, 13], [45, 12, 19, 34, 12], [588, 12, 34, 12]]
# Solution
# My solution
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;
class ListUtils {
/**
* It splits the passed list into a sequence of sublists with a predefined size
*/
public static <T> List<List<T>> splitListIntoSubLists(List<T> list, int subListSize) {
List<List<T>> sublists = new ArrayList<>();
// write your code here
int fromIndex;
int toIndex = 0;
for (int i = 0; i < list.size() / subListSize + 1; i++) {
fromIndex = toIndex;
toIndex += subListSize;
if (toIndex > list.size()) {
toIndex = list.size();
}
sublists.add(list.subList(fromIndex, toIndex));
}
return sublists;
}
}
/* Please, do not modify code in this class */
public class Main {
public static void main(String[] args) {
final Scanner scanner = new Scanner(System.in);
final String[] values = scanner.nextLine().split("\\s+");
final List<Integer> list = Arrays.asList(values).stream()
.map(Integer::parseInt)
.collect(Collectors.toList());
final int subListSize = Integer.parseInt(scanner.nextLine());
final List<List<Integer>> subLists = ListUtils.splitListIntoSubLists(list, subListSize);
subLists.forEach(subList -> {
final String representation = subList.stream().map(Object::toString).collect(Collectors.joining(" "));
System.out.println(representation);
});
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# Other solution 1
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;
class ListUtils {
/**
* It splits the passed list into a sequence of sublists with a predefined size
*/
public static <T> List<List<T>> splitListIntoSubLists(List<T> list, int subListSize) {
List<List<T>> sublists = new ArrayList<>();
for (int i = 0; i < list.size(); i += subListSize) {
sublists.add(
list.subList(
i, Math.min(i + subListSize, list.size())
)
);
}
return sublists;
}
}
/* Please, do not modify code in this class */
public class Main {
public static void main(String[] args) {
final Scanner scanner = new Scanner(System.in);
final String[] values = scanner.nextLine().split("\\s+");
final List<Integer> list = Arrays.asList(values).stream()
.map(Integer::parseInt)
.collect(Collectors.toList());
final int subListSize = Integer.parseInt(scanner.nextLine());
final List<List<Integer>> subLists = ListUtils.splitListIntoSubLists(list, subListSize);
subLists.forEach(subList -> {
final String representation = subList.stream().map(Object::toString).collect(Collectors.joining(" "));
System.out.println(representation);
});
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
编辑 (opens new window)
上次更新: 2022/12/03, 17:31:39