2016-09-25 67 views
1

我想讀取一個csv並將記錄存儲在一個ArrayList中。 因爲我知道沒有。 csv文件中的記錄我在創建對象時指定了大小,即600。 我希望程序能夠讀取未知的文件。的記錄。 我如何使它動態。在java中使用ArrayList的getter和setter

以下是具有600條記錄的文件的工作代碼。

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 
import java.io.*; 


public class BankRecords extends Client{ 
//Create objects for processing data 
//private static int count; 
static BankRecords[] obj=new BankRecords[600]; 
static List<List<String>> array = new ArrayList<List<String>>(); 
@Override 
void readData() { 
    // TODO Auto-generated method stub 
    String line=" "; 
    //int i=0; 

    //try with resources statement 
    try(BufferedReader br = new BufferedReader(new FileReader("bank-Detail.csv"))){ 

     while((line=br.readLine()) != null) //read from file 
     { 
      array.add(Arrays.asList(line.split(","))); 
      //check data 
      //count++; 
      //System.out.println(array.get(i++)); 
     } 

    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    processData(); 
} 
@Override 
void processData() { 
    // TODO Auto-generated method stub 

    int idx=0; 
    for(List<String> bankData: array) 
    { 

     obj[idx]= new BankRecords(); 
     obj[idx].setId(bankData.get(0)); 
     obj[idx].setAge(Integer.parseInt(bankData.get(1))); 
     obj[idx].setSex(bankData.get(2)); 
     obj[idx].setRegion(bankData.get(3)); 
     obj[idx].setIncome(Double.parseDouble(bankData.get(4))); 
     obj[idx].setMarried(bankData.get(5)); 
     obj[idx].setChild(Integer.parseInt(bankData.get(6))); 
     obj[idx].setCar(bankData.get(7)); 
     obj[idx].setSact(bankData.get(8)); 
     obj[idx].setCact(bankData.get(9)); 
     obj[idx].setMort(bankData.get(10)); 
     obj[idx].setPep(bankData.get(11)); 


     idx++; 

     //System.out.println(obj[idx].getId()); 
     } 

    printData(); 
} 





@Override 
void printData() { 

    //Printing First 25 ID, age, sex, region, income and mortgage 
    System.out.println("ID\t\tAGE\t\tSEX\t\tREGION\t\tINCOME\t\tMORTGAGE\n"); 
    for(int i=0;i<25;i++){ 

     String s=String.format("%s\t\t%s\t\t%s\t\t%-10s\t%8.2f\t%2s", obj[i].getId(),obj[i].getAge(),obj[i].getSex(),obj[i].getRegion(),obj[i].getIncome(),obj[i].getMort()); 
     System.out.println(s); 
    } 
} 
public String getId() { 
    return id; 
} 




public void setId(String id) { 
    this.id = id; 
} 




public int getAge() { 
    return age; 
} 




public void setAge(int age) { 
    this.age = age; 
} 




public String getSex() { 
    return sex; 
} 




public void setSex(String sex) { 
    this.sex = sex; 
} 




public String getRegion() { 
    return region; 
} 




public void setRegion(String region) { 
    this.region = region; 
} 




public double getIncome() { 
    return income; 
} 




public void setIncome(double income) { 
    this.income = income; 
} 




public String isMarried() { 
    return married; 
} 




public void setMarried(String married) { 
    this.married = married; 
} 




public int getChild() { 
    return child; 
} 




public void setChild(int child) { 
    this.child = child; 
} 




public String getCar() { 
    return car; 
} 




public void setCar(String car) { 
    this.car = car; 
} 




public String getSact() { 
    return sact; 
} 




public void setSact(String sact) { 
    this.sact = sact; 
} 




public String getCact() { 
    return cact; 
} 




public void setCact(String cact) { 
    this.cact = cact; 
} 




public String getMort() { 
    return mort; 
} 




public void setMort(String mort) { 
    this.mort = mort; 
} 




public String getPep() { 
    return pep; 
} 




public void setPep(String pep) { 
    this.pep = pep; 
} 




public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    BankRecords bnk= new BankRecords(); 
    bnk.readData(); 
} 
事先以使用 ArrayList

}

回答

0

ArrayList可以動態地顯示元素,所以不需要事先知道大小。

但是,對於BankRecords陣列,請不要初始化爲600。相反,做這樣的事情:

static BankRecords[] obj = null; 
static List<List<String>> array = new ArrayList<List<String>>(); 
void processData() { 
    // TODO Auto-generated method stub 
    obj=new BankRecords[array.size()]; 
    // TODO do your work here 
} 
0

你不必知道的記錄數。您可以在構造函數中指定默認大小,但是如果您添加的記錄數多於此值,則足夠聰明可以自行展開。

0

你就要成功了,但使用的是列表中的地方,你已經有一個數組一些奇怪的原因;但另一方面,你正在使用一個數組,其中List會更好。

如下您可以返工您的代碼:

// TODO Auto-generated method stub 

提示:那些TODOS是由你的IDE生成。這個想法是,只要你有一些真正的內容,你刪除他們。保持它們意味着在您的源代碼中留下垃圾。任何不會爲您的源代碼增加真正價值的東西:刪除它。總是。立即!

String line=" "; 
List<Bankrecord> records = new ArrayList<>(); 
//int i=0; ... again: unused code --- remove that! 
try(BufferedReader br = new BufferedReader(new FileReader("bank-Detail.csv"))){ 
    while((line=br.readLine()) != null) //read from file 
    { 
     String[] lineData = line.split(","); 
     BankRecord recordForNewLine = buildRecordFrom(lineData); 
     records.add(recordForNewLine); 
    } ... 

然後你可以返工您過程數據成類似:

private BankRecord buildRecordFrom(String[] lineData) { 
    BankRecord newRecord = new BankRecords(); 
    newRecord.setId(lineData[0]; 
    ... 
    return newRecord; 
} 

而且事情,你真的應該考慮改變,太:

  • 通過簡單地建立你的銀行紀錄假設該列包含有效的ID,並且下一列包含有效的xyz ...是不好的的想法。
  • 取而代之,你應該是驗證所有的輸入:你應該檢查你從分割獲得的每個數組具有**的確切長度。然後必須驗證該陣列中的每個值都具有預期的「內容」
  • 然後,從建模角度來看:您的Bankrecord類上有大量的設置器。但那根本就是錯的!在現實生活中,當創建一些「記錄」時,其基本屬性(如其ID)不能在創建後更改!
  • 相反,您應該確保在創建對象後,類中的這些屬性不能更改。去這裏的路:Builder pattern

最後:我的代碼上面的意思是「啓發點」,讓你走。不要盲目地複製/粘貼它;可能會出現各種拼寫錯誤 - 只是讀取它,直到你知道它在做什麼(以及爲什麼)(它在做什麼)!

然後:我希望你明白real CSV解析要比分解「,」要複雜得多(例如:CSV數據中的字符串也可以包含',';然後你的簡單分割會撕裂字符串!) 如果您認真分析現實世界中其他人的CSV輸入,那麼您最好考慮使用現有庫爲您完成此操作。寫一個正確 CSV分析器是工作(並沒有很好的回報;因爲這意味着重新發明一個複雜的輪子沒有很好的理由)!