所以通常,我知道人们会使用标准 for 循环来遍历数组,如下所示:
public static void readCodesFromFile(String filename, String[] codes) throws FileNotFoundException {
try ( Scanner fin = new Scanner(new File(filename) ); ) {
for (int i = 0; i <= codes.length - 1; i++) {
codes[i] = fin.nextLine();
}
}
}
但是,我非常想知道如何使用 for each 循环来做到这一点。在这一点上,我只需要知道它是否可以完成,但也很喜欢使用此循环执行此任务的效率和清洁度。我尝试过这样的事情,并多次移动东西,但似乎无法正确阅读任何内容。
以下是我一直在使用的每个(:):
public static void readCodesFromFile(String filename, String [] codes) throws FileNotFoundException {
try (Scanner fin = new Scanner(new File(filename) ); ) {
for (String code : codes) {
codes = fin.nextLine();
}
}
}
在这一点上,我只需要知道是否可以完成...
不,不像它写的那样。一方面,规范不允许这样做,但您也在处理不可变的String
s。说,从你的第二个例子,code
是对数组中元素的引用。一旦我这样做code = "foo";
,code
现在引用(大概)新的String
并且数组元素保留其原始值。
但是,我非常想知道如何使用 for each 循环来做到这一点。
如果是这样,为什么不把问题倒过来呢?提供一种迭代文件的方法,而不是迭代数组。
在这个答案中,我将假设两件事:
Iterable
FileReader
ArrayList
而不是普通数组(这是为了解决索引问题,额外的好处是您不再需要知道或关心文件中的行数)这是FileReader
(很多没有实现):
class FileReader implements Iterable<String> {
@Override
public Iterator<String> iterator() {
return new FileReaderIterator();
}
@Override
public void forEach(Consumer<? super String> action) { }
@Override
public Spliterator<String> spliterator() { return null; }
class FileReaderIterator implements Iterator<String> {
@Override
public boolean hasNext() {
return false;
}
@Override
public String next() {
return null;
}
@Override
public void remove() { }
@Override
public void forEachRemaining(Consumer<? super String> action) { }
}
}
假设你实现了这个,你可以像这样使用它:
List<String> lines = new ArrayList<>();
FileReader reader = new FileReader(...);
for (String line : reader) {
lines.add(line);
}
我不是建议你改变你的设计,而是考虑不同的设计选择可以提供什么。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句