我正在尝试使用tokenizer将.txt文件的内容插入到向量中;但是一个特定的文件没有被插入。后来我需要将向量的内容传递给jtable。问题是.txt的第一行有空值所以它没有插入它跳过第一行并继续前进..是有一种方法可以在向量中存储null并将其替换为“”?
private void loadSecondPreview() {
String aLine;
recordData = new Vector();
columnNames = new Vector();
try {
FileInputStream fin = new FileInputStream(dataFile);
BufferedReader br = new BufferedReader(new InputStreamReader(fin));
// extract column names
if (delimiter == ",") {
StringTokenizer st1 =
new StringTokenizer(br.readLine(), ",");
while (st1.hasMoreTokens()) {
columnNames.addElement(st1.nextToken());
}
// extract data
while ((aLine = br.readLine()) != null) {
StringTokenizer st2 =
new StringTokenizer(aLine, ",");
while (st2.hasMoreTokens()) {
recordData.addElement(st2.nextToken());
}
}
} else if (delimiter == "\t") {
StringTokenizer st1 =
new StringTokenizer(br.readLine(), "\t");
while (st1.hasMoreTokens()) {
if (st1.equals(null)) {
columnNames.addElement(" ");
} else {
columnNames.addElement(st1.nextToken());
}
}
// extract data
while ((aLine = br.readLine()) != null) {
StringTokenizer st2 =
new StringTokenizer(aLine, "\t");
while (st2.hasMoreTokens()) {
if (st2.equals(null)) {
recordData.addElement(" ");
} else {
recordData.addElement(st2.nextToken());
}
}
}
}
br.close();
System.out.println("Column vector size:" + columnNames.size());
System.out.println("Record vector size:" + recordData.size());
for (int x = 0; x < columnNames.size(); x++) {
System.out.println("Column vector:" + x + " " + columnNames.elementAt(x));
}
for (int x = 0; x < recordData.size(); x++) {
System.out.println("Record vector:" + x + " " + recordData.elementAt(x));
}
O / P: **列矢量大小:0 记录矢量大小:5 记录向量:0 8 记录向量:1 8.100 记录向量:2 8.200 记录向量:3 9 记录载体:4 9.8
测试文件记录:第一行有两个空值列
8 8.100 8.200 9 9.8
答案 0 :(得分:2)
试试这个
BufferedReader in = new BufferedReader(new FileReader(loc + fname));
ArrayList<String []> input = new ArrayList<String []>();
String [] temp;
String line;
String stemp = null, sprev;
ArrayList<String> comp = new ArrayList<String>();
while((line = in.readLine())!= null)
{
StringTokenizer st = new StringTokenizer(line, ",", true);
temp = new String [15];
int i = 0;
while(st.hasMoreTokens())
{
sprev = stemp;
stemp = st.nextToken();
if((stemp.equals(sprev)) && stemp.equals(","))
{
//it is a null field
temp[i++] = null;
}
else if(!(stemp.equals(",")))
{
temp[i++] = stemp;
}
}
input.add(temp);
为我工作
答案 1 :(得分:1)
类似的东西:
add(value == null ? "" : value)
答案 2 :(得分:0)
为什么要使用Vector?考虑列表,因为它将维护订单。 有多种方法可以替换空字符串来代替null。如果您要在代码中的某个位置添加对象,而不是 Tom 提到的对象。如果有多个地方,甚至比扩展Vector和覆盖添加或方便的方法将最小化检查在一个地方
答案 3 :(得分:0)
代码中的以下行
if (st1.equals(null)) {
没有任何意义。您正在测试您的tokenizer是否存在,而不是它是否会返回下一个令牌。
使用此模式:
String nextToken = tokenizer.nextToken()
if (nextToken != null) {
....
}
DO 使用变量。因为if (tokenizer.nextToken() == null) { vec.add(tokenizer.nextToken()); }
将使用 TWO 令牌。一个用于测试,一个用于添加,使整个测试毫无意义和破坏。
它不会因为它更短而更快。初学者错误,尝试通过减少写入来优化代码。