2016-09-25 382 views
1

私はcsvを読み込み、ArrayListにレコードを格納しようとしています。 私はノーを知っているので。 csvファイル内のレコードのサイズを指定します。つまり、オブジェクトを作成するときに600を指定します。 私はプログラムが未知の番号のファイルを読むことができるようにします。レコードの。 動的にするにはどうすればいいですか?getterとsetterをJavaのArrayListと共に使用する

ここに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(); 
} 

}

答えて

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

あなたはArrayListを使用するためには事前にレコードの数を知っている必要はありません。コンストラクタではデフォルトのサイズを指定できますが、それ以上のレコードを追加した場合は、それ自体を拡張するほどスマートです。

0

をあなたは、ほぼありますが、あなたはすでに配列がある場所でリストを使用しているいくつかの奇妙な理由のために、もう一方の側では、Listがもっと適している配列を使用しています。

次のようにあなたのコードを手直しすることができます

// TODO Auto-generated method stub 

ヒント:これらのTODOのは、あなたの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); 
    } ... 

そして、あなたのような何かにあなたのPROCESSDATAをリワークできます

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

そして、あなたは本当にあまりにも、変更することを検討すべき事柄:

  • あなたの銀行レコードを構築するだけで列に有効なIDが含まれており、次の列に有効なxyzが含まれていると仮定すると... が不備アイデアです。
  • すべての入力を検証する必要があります。から得られる各配列がであることを確認する必要があります。そして、配列の各値に期待される "内容"があることを検証する必要があります
  • 次にモデリングの観点から:セッターをBankrecordクラスに持っています。しかし、それは単に間違っている!実際の生活では、いくつかの「レコード」が作成されると、その必須プロパティ(IDなど)は作成後に変更できません。
  • 代わりに、オブジェクトが作成された後でクラスのそのようなプロパティを変更できないようにする必要があります。ここに行く方法:Builder pattern

最後に、上記のコードは、あなたを得るための「インスピレーションポイント」を意味します。盲目的にそれをコピー/ペーストしないでください。いろいろなタイプミスがあるかもしれません - あなたが何を(そしてなぜ)行っているのか(それが何をしているのか)を得るまでそれを読んでください!

実際の CSV解析は、 "、"(たとえば、CSVデータの文字列に '、'も含めることができます。文字列!) 現実世界の他の人のCSV入力を解析することについて真剣に考えているなら、既存のライブラリを使用してこれを行うことをお勧めします。 正しいを書くCSVパーサーはハードなです(これはあまり意味がありません。

関連する問題