2016-09-25 3 views
1

Я пытаюсь прочитать csv и хранить записи в ArrayList. Так как я знаю, нет. записей в файле csv Я указываю размер, то есть 600 при создании объекта. Я хочу, чтобы программа могла читать файлы неизвестного пользователя. записей. Как сделать его динамичным.Использование геттеров и сеттеров с ArrayLists в java

Вот рабочий код для файла с 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 

ПОДСКАЗКА: эти Todos генерируются вашим IDE. Идея в том, что вы удалите их, как только у вас есть реальный контент. Сохранение их означает оставить мусором в вашем исходном коде. Все, что не добавляет реальной ценности в исходный код: удалить it. Всегда. Немедленно!

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

И то, что вы действительно должны рассмотреть изменения, тоже:

  • Строим свои банковские счета, просто предполагая, что столбец содержит действительный идентификатор, а следующий столбец содержит допустимый xyz ... - это bad идея.
  • Вместо этого вы должны быть , проверяя все ваши данные: вы должны проверить, что каждый массив, который вы получаете от , раскол имеет ** точно ожидаемую длину. И затем нужно проверить, что каждое значение из этого массива имеет ожидаемый «контент»
  • Затем, с точки зрения моделирования: у вас есть тонна сеттеров на вашем классе Bankrecord. Но это просто неправильно! В реальной жизни, когда создается какая-то «запись», ее существенные свойства (например, ее идентификатор) не могут быть изменены после создания!
  • Вместо этого вы должны убедиться, что такие свойства в вашем классе не могут быть изменены после создания объекта.Путь сюда: Builder pattern!

И наконец: мой код выше называется «точкой вдохновения», чтобы вы могли двигаться. Не слепо копировать/вставлять его; могут быть разные опечатки - просто прочитайте его, пока не получите то, что (и почему) оно делает (что он делает)!

Тогда: Я надеюсь, вы понимаете, что реального CSV разбор гораздо сложнее, чем расщепление вокруг «» (например: строки в данном CSV могут содержать «» тоже, и тогда ваш простой раскол будет разрывать, что string!) Если вы серьезно относитесь к синтаксическому анализу CSV-данных реального мира, то вам лучше изучить существующие библиотеки, чтобы сделать это за вас. Дать правильно CSV парсер hard Работа (и не очень полезная, так как это означает повторное создание сложного колеса без уважительной причины)!

Смежные вопросы