2012-06-02 34 views
1

我正在嘗試將使用標記器的.txt文件的內容插入到向量中;但一個特定的文件不會被插入。後來我需要將向量的內容傳遞給一個Jtable later.The問題是.txt的第一行有空值,所以它沒有插入它跳過第一行,並繼續前進..是有一種方法可以將null存儲在向量中,並將其替換爲「」?在Java向量中插入空值

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.8

+2

你就不能插入之前檢查nulll,如果空插入一個空值呢? – home

回答

1

是這樣的:

add(value == null ? "" : value) 
+0

所以我認爲問題是與StringTokenizer;我確實用columnNames.addElement替換了我的代碼(st1.nextToken()== null?「」:st1.nextToken());這是正確的方式嗎? –

+0

是的,這就是我所需要的;如果問題仍然存在,無論如何它確實是別的東西 – Tom

+0

;最好使用List(例如ArrayList); Vector是一箇舊類,你不應該在新代碼中使用它。 – Tom

0

爲什麼要使用矢量?考慮列表,因爲它會維持秩序。 有多種方法可以替換空字符串以代替空。如果您要從代碼中僅添加一個對象,而不是提到的對象,那麼將會使用Tom。如果有多個地方,甚至比擴展矢量和壓倒一切的添加或有方便的方法將在一個地方

+0

'矢量'也維持順序。事實上,'Vector'實現'List'並擴展'AbstractList'。 –

0

下面一行儘量減少檢查你的代碼

if (st1.equals(null)) { 

沒有任何意義。您正在測試您的標記器是否存在,而不是它是否會返回下一個標記。

使用此模式:

String nextToken = tokenizer.nextToken() 
if (nextToken != null) { 
    .... 
} 

DO使用變量。因爲if (tokenizer.nextToken() == null) { vec.add(tokenizer.nextToken()); }將使用TWO令牌。一個用於測試,一個用於添加,使得整個測試毫無意義並且被破壞。

因爲它更短,所以不會更快。初學者錯誤,試圖通過寫少的優化代碼。

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); 

對我的作品