我有一个程序可以读入文本文件,并使用逗号作为分隔符来标记单词。它工作正常,但现在我需要从使用二维数组切换到我知道有多少元素将使用二维ArrayList,因为我不知道将传递多少元素ArrayList。
这里是使用多维数组的工作代码,我真的只是想找到一种方法来改变下面的方法来使用ArrayList,这样我就可以将未知数量的元素传递给数组。
String filename = "input.txt";
File file = new File(filename);
Scanner sc = new Scanner(file);
arraySize = sc.nextLine().trim();
int size = Integer.parseInt(arraySize);
// creates a multidimensional array with the size set from the input file.
String[][] myArray = new String[size][];
// the outer for loop iterates through each line of the input file to populate the myArray.
for (int i = 0; i < myArray.length; i++) {
String line = sc.nextLine();
myArray[i] = line.split(","); //splits each comma separated element on the current line.
//the inner for loop gets each element of myArray and removes any white space.
for (int j = 0; j < myArray[i].length; j++) {
myArray[i][j] = myArray[i][j].trim();
}
}
这是我一直在研究的,唯一的主要区别是该文件将有空格作为分隔符而不是逗号。并且它将从文件中读入未知数量的元素到数组中。 add()方法给了我以下错误。
The method add(int, List<String>) in the type List<List<String>> is not applicable for the arguments (String)
String filename = "input.txt";
File file = new File(filename);
Scanner sc = new Scanner(file);
// ArrayList<ArrayList<String>> myArray = new ArrayList<ArrayList<String>>();
List<List<String>> myArray = new ArrayList<>();
while(sc.hasNextLine()) {
String line = sc.nextLine(); // each line will have an equation
String[] equations = line.split("\\s+");
for (String s : equations) {
s = s.trim();
// myArray.add(s); can't figure out how to add into arraylist
}
}
sc.close();
编辑:我没有尝试将现有数组传递给ArrayList,只是试图找到一种方法来获取多维ArrayList来保存从中读取的未指定数量的元素输入文件中,输入文件中的每个单词需要使用空格作为分隔符进行分割,并存储在ArrayList中。
答案 0 :(得分:1)
为文件中的每一行创建一个新的ArrayList
对象。填充它并添加到容器ArrayList。
String filename = "input.txt";
File file = new File(filename);
Scanner sc = new Scanner(file);
List<List<String>> myArray = new ArrayList<>();
while(sc.hasNextLine()) {
String line = sc.nextLine(); // each line will have an equation
String[] equations = line.split("\\s+");
List<String> lineArray = new ArrayList<>();
for (String s : equations) {
s = s.trim();
lineArray.add(s);
}
myArray.add(lineArray);
}
sc.close();
答案 1 :(得分:0)
将数组转换为ArrayList
您可以通过以下方式执行此操作:
Arrays.stream(equations).map(s -> s.trim()).collect(Collectors.toList());
修改强>:
使用line.split("\\s+");
,您已经将该行与一个或多个连续空格分开。所以你不必打电话给修剪。所以以下是一个简洁的版本。谢谢@shmosel。
Arrays.asList(equations);
答案 2 :(得分:0)
使用Files.lines
它看起来像这样:
public static void main(String[] args) throws IOException {
List<List<String>> words = new ArrayList<>();
try(Stream<String> lines = Files.lines(Paths.get("input.txt"))) {
lines.forEach(line -> words.add(Arrays.asList(line.split("\\s+"))));
}
}
如果我们也使用Pattern.splitAsStream
,那就会有点啰嗦,但我比Stream.forEach
更喜欢它。从理论上讲,这种方法可以更有效:
public static void main(String[] args) throws IOException {
List<List<String>> words;
Pattern p = Pattern.compile("\\s+");
try(Stream<String> lines = Files.lines(Paths.get("input.txt"))) {
words = lines.map(s -> p.splitAsStream(s).collect(toList())).collect(toList());
}
}
答案 3 :(得分:-1)
new ArrayList<>(Arrays.asList(array))
重复here