背景:
我正在使用Selenium进行抓取项目,该项目从测试和生产环境中的网页表中获取数据,然后将数据存储到两个单独的字符串类型的数组列表中(一个用于测试/产品)。数据为数字(双精度),共有3列,数据范围为13-16行。由于我要从145个以上的国家/地区提取数据,所以每个表都不相同。
请不要只说这是一个例子。我在此处显示的代码不是我正在运行的Selenium脚本。
问题:
问题出在当我尝试将我拥有的两个数组列表中的数据转换成两个二维数组时。我以前使用过非常基本的2d数组,但是仅根据用户输入创建它们。
根据我之前所做的研究,将ArrayList转换为数组的语法为:
ArrayList<String> b = new ArrayList<>();
b.add("1.50");
b.add("3.12");
b.add("5.25%");
b.add("2.16");
b.add("4.36");
b.add("7.76%")
//This is just a snippet, remember the list would have anywhere from 13-16
indices.
String[] x = b.toArray();
但是我如何将相同的列表转换为格式为
的二维数组 1.50 3.12 5.25%
2.16 4.36 7.76%
每三个索引重新开始一行?
答案 0 :(得分:2)
除非您发现其中包含百分比(List
)的值,否则您必须循环%
并将这些项添加到新项。然后,您创建一个新的List
。此解决方案基于%
字符外观,而不是要分割的元素之间的间隙的固定大小,这可能是一个优势。
List<List<String>> outer = new ArrayList<>();
List<String> inner = new ArrayList<>();
for (String s: b) {
inner.add(s);
if (s.contains("%")) {
outer.add(inner);
inner = new ArrayList<>();
}
}
List<List<String>> outer
将包含以下值:
[[1.50,3.12,5.25%],[2.16,4.36,7.76%]
要将结构从List<List<String>>
转换为String[][]
,可以使用java-stream或简单的for循环方法迭代并填充数组。
String[][] array = outer.stream()
.map(a -> a.stream().toArray(String[]::new)) // List<String> to String[]
.toArray(String[][]::new); // List<String[]> to String[][]
答案 1 :(得分:1)
典型的for循环应该这样做:
List<List<String>> accumulator = new ArrayList<>();
for (int i = 0; i < b.size(); i+=3) {
List<String> temp = new ArrayList<>(b.subList(i, i + 3));
accumulator.add(temp);
}
accumulator
现在看起来像:
[[1.50, 3.12, 5.25%], [2.16, 4.36, 7.76%]]
请注意,以上内容假设您的列表始终是三的倍数,如果不是这种情况,则可以按以下方式进行处理:
List<List<String>> accumulator = new ArrayList<>();
for (int i = 0; i < b.size(); i+=3) {
List<String> temp = b.stream().skip(i).limit(3).collect(toList());
accumulator.add(temp);
}
如果您严格要求结果为String[][]
,则可以按以下方式获得结果:
String[][] strings =
accumulator.stream()
.map(l -> l.toArray(new String[0]))
.toArray(String[][]::new);
答案 2 :(得分:1)
您可以遍历列表,并将条目手动添加到二维数组中:
String[][] array = new String[b.size()/3][3];
for (int i = 0; i < b.size(); i++) {
int row = i / 3;
int col = i % 3;
array[row][col] = b.get(i);
}
System.out.println(Arrays.deepToString(array));