我尝试编写一个采用BlockingQueue<列表<串[]> >并将文件路径作为String,并将该文件的每一行添加到队列中,作为包含该行为String []的ArrayList。 (我稍后会在每个ArrayList中添加更多String []。)
例:
-queue = {{A1,A2},{B}}(A1,A2,B,是String [])
-Lines in file = {l1,l2,L3}(l1,l2,l3也是String [])
通缉结果:
-queue = {{A1,A2},{B},{l1},{l2},{l3}}
我的问题是,当我添加一个元素时,queue.add(element)返回true,但没有添加任何元素。
到目前为止我的代码:
public boolean loadOneFile(BlockingQueue<List<String[]>> queue, String path) throws IOException, InterruptedException {
CSVReader reader = new CSVReader(new FileReader(path), Main.separator.toCharArray()[0], '"', false);
// Skip header
int headerSize = reader.readNext().length;
while (reader.isHasNext()) {
String[] line = reader.readNext();
ArrayList<String[]> rowInQueue = new ArrayList<String[]>();
rowInQueue.add(line); // this line does work
boolean test = queue.add(rowInQueue);// the variable "test" becomes true...
int debug = queue.size(); // ...but the variable "debug" stays to 1...
// ...and queue does not change and only has the same "kinda-empty" element from initialisation.
}
}
reader.close();
return true;
}
使用包含String [1]和“”:
的列表初始化队列BlockingQueue<List<String[]>> toProcessQueue = new LinkedBlockingQueue<List<String[]>>(50000);
String[] emptyLine = { "" };
ArrayList<String[]> emptyCombinaison = new ArrayList<String[]>();
emptyCombinaison.add(emptyLine);
BlockingQueue<List<String[]>> emptyQueue = new LinkedBlockingQueue<List<String[]>>();
boolean test = toProcessQueue.add(emptyCombinaison);
上下文:在类中调用该方法。参数是类的受保护的volatile属性。
更广泛的上下文:这是我的第一步,让一个文件的每一行与另一个文件的每一行匹配的队列。或任意数量的大文件。 例如2个文件: file1:{A,B} +文件2:{a,b,c} - &gt;队列:{{A,a},{A,b},{A,c},{B,a},{B,b},{B,c}}(顺序无关紧要) 奖励:它必须适用于大文件,必要时等待队列清空。
我的问题是:
1)对于第一步(队列中的1个文件),可能有一个更简单(因此更可靠)的方法吗?
2)有没有更简单的方法来完成第二步(2个文件的“笛卡尔积”)?
3)为什么.add(elmt)在这种特殊情况下没有效果?
感谢。