Arquivo CSV

Olá Pessoal!
Estou desesperado, alguém me ajuda por favor…

O objetivo final é ler um arquivo.csv e gerar um grafico (através do jFreechart). Pois bem. Eu consegui ler o arquivo normalmente, mas estou muito confuso em relação à como fazer o relacionamento entre as classes. Segue o código:

Classe Controller - Pacote principal:

ublic class Controller {
public static void main(String[] args) {
LeitorDeArquivo leitor = new LeitorDeArquivo();
leitor.lerArquivo(“H:\Programação\Java\Projetos\ProjetoIntegrado\dados.csv”);
imprimeLista();

}

}

Pacote model - Classe Pais:

private  String ranking;
private  String pais;
private static ArrayList<Pais> listaPais= new ArrayList<Pais>();
private static ArrayList<Pib> pibs = new ArrayList<Pib>();




public Pais(String ranking, String pais) {
    this.ranking = ranking;
    this.pais = pais;
    listaPais.add(this);
   
}

 public static void ano_pib(int ano, String pib){
     pibs.add(new Pib(ano, pib));
 }

public static void imprimeLista(){
   /* for(Pais i : listaPais){
        System.out.println(i.getRanking() + "\t" + i.getPais() + "\t");
    }*/
   
   for(Pib i : pibs){
       System.out.println(i.getAno() + "\t" +  i.getPib());
   }
     }





public String getRanking() {
    return ranking;
}

public String getPais() {
    return pais;
}

}

Pacote model - Classe Pib:

public class Pib {
private int ano;
private String Pib;
private static ArrayList listaPib = new ArrayList();

public Pib(int ano, String Pib) {
    this.ano = ano;
    this.Pib = Pib;
    this.listaPib.add(this);
}



public  ArrayList<Pib> getListaPib() {
    return listaPib;
}

public int getAno() {
    return ano;
}

public String getPib() {
    return Pib;
}

}

Pacote util - Classe LeitorDeArquivo:
public class LeitorDeArquivo {

private static ArrayList<String> lista = new ArrayList<String>(); // lista que armazena os dados obtidos
private static ArrayList<Integer> listaAno = new ArrayList<Integer>(); // lista que armazena os anos

public LeitorDeArquivo() { //construtor
    
}




public void lerArquivo(String nome){
    File arquivo = new File(nome);
    BufferedReader br = null;
    String linha = "";
    String csvDivisor = ";";

    try {
        int inc_linha = 0;
        int ano = 0;
        br = new BufferedReader(new FileReader(arquivo));
        while((linha = br.readLine()) != null){
            String[] itens = linha.split(csvDivisor);
            for(int i = 0; i <= 1; i++){ //varre as linhas
                itens[i] = itens[i].replace("..", "0");   
                
                
              Pais pais = new Pais(itens[0], itens[1]);
            }
                
            for( int j = 2; j < itens.length; j++){
                    
                   
                   ano = Integer.parseInt(itens[j]);
                   Pais.ano_pib(ano, (itens[j])); //pega a coluna 2, 3, 4....
                    
            }
            inc_linha++;
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e){
        e.printStackTrace();
    } finally{
        if(br != null){
            try {
                br.close();
            } catch (IOException e) {
               e.printStackTrace();
            }
    }
}

}

}


O problema é o seguinte: minha tabela segue a seguinte estrutura:

HDI Rank;Country;1980;1985;1990;2000;2005;2006;2007;2008;2009;2010;2011;2012
1;Norway;5.8;5.4;6.4;6.6;7.0;6.5;6.7;6.4;7.3;6.9;…;6.9
2;Australia;5.7;5.4;4.7;4.9;4.9;4.8;4.7;4.6;5.1;…;…;5.1
3;Switzerland;4.6;4.5;4.8;5.1;5.5;5.3;5.0;5.1;5.4;…;…;5.4
4;Netherlands;6.4;5.9;5.6;5.0;5.5;5.5;5.3;5.5;5.9;6.0;…;6.0
5;United States;…;…;5.0;…;5.3;5.6;5.5;5.5;5.4;5.6;…;5.6
6;Germany;…;…;…;…;…;4.4;4.5;4.6;5.1;…;…;5.1

Entao meio que há três variáveis: o Ano, o pais e o pib em si. Sei que devo fazer algo como criar um objeto Ano e dentro dele botar todos os Pibs, mas nao sei como fazer isso… alguém me ajuda por favor!!!

Transfira para uma Tabela para facilitar o acesso aos dados:

class Tabela {

  private String[] colunas;
  private ArrayList<String[]> linhas;

  public int qtdDeAnos() { return colunas.length - 2; }

  public void adicionarLinha(String[] linha) {
    if (colunas == null) colunas = linha;
    else linhas.add(linha);
  }

  // item[0] será o nome da coluna e o item[1] será o valor
  public String[] obterItem(int linha, int coluna) {
    return new String[]{ colunas[coluna], linhas.get(linha)[coluna] };
  }
}
1 curtida

Entendi mais ou menos… na linha “public int qtdDeAnos() { return colunas.length - 2; }”, por que a qtdDeAnos vai ser o tamanho de “colunas” - 2 ?

Eu acho que é isso, a primeira é o rank, a segunda é o nome do país, portanto seria o total de colunas -2. Talvez fosse melhor ter os métodos qtdDeColunas e qtdDeLinhas, aquilo que postei é só um exemplo.

Depois que ler todo o arquivo e passar para essa tabela, fica mais fácil construir os objetos:

para linha de 0 até tabela.qtdDeLinhas {
  String[] item;
  item = tabela.obterItem(linha, 0);
  int rank = toInt(item[1]);
  item = tabela.obterItem(linha, 1);
  String nome = item[1];
  Pais p = new Pais(rank, nome);
  para coluna de 2 até tabela.qtdDeColunas {
    item = tabela.obterItem(linha, coluna);
    int ano = toInt(item[0]);
    int valor = toInt(item[1]);
    Pib pib = new Pib(ano, valor);
    pais.listaDePibs.add(pib);
  }
}