Agrupamento com Map

Pessoal, boa tarde.

Não estou conseguindo resolver um problema, parece bobo, mas não estou.

Seguinte: tenho um arquivo CSV com ids dos cursos e na frente os ids das disciplinas.

Quero agrupar as disciplinas de acordo com o id do curso.

Por exemplo:
id curso = 1, disciplinaX, disciplinaY, disciplinaWWW
id cursos = 2, disciplinaX, disciplina WWWW

O problema é que no meu CSV as linhas repetem o valor do id do curso, ou seja, para cada disciplina do curso, tem uma linha nova, preciso agrupar.

Tentei fazer com Map, mas não estou conseguindo evoluir.

Segue meu codigo, se alguem conseguir me ajudar, agradeço muito:


        PrintWriter dataSetDisciplinesPrint = new PrintWriter(this.createDataSetFile(file.getParent(), "dataSet1"), true);

        //Começa a leitura dos arquivos enviados
        FileReader freader = new FileReader(file.getAbsolutePath());
        Scanner sc = new Scanner(freader);

        //Cria um Map que irá gravar o id do Currículo (key value) e as suas respectivas disciplinas sem seguida
        //No MAP o key value não pode ser repetido, então basta inserir os ids dos currículos nessa posição
        //Como algumas disciplinas podem ter mais de um pré-requisito, então alguns ids de disciplinas podem se repetir, por isso a segunda posição do Map recebe um HashSet (que não aceita valores repetidos)
        Map<String, HashSet> idCurriculo_Disciplinas = new HashMap<String, HashSet>();

        //HahsSet que irá receber os ids das disciplinas de cada currículo
        HashSet<String> idsDisciplinas = new HashSet<String>();      

        String idCurr = null;
        String idDisc = null;

        while (sc.hasNextLine()) {  //Lendo o arquivo                      
            String line = sc.nextLine();
            String[] fields = line.split(";");
            
            idCurr = fields[0];
            idDisc = fields[1];                      
            
            idCurriculo_Disciplinas.put(idCurr, idsDisciplinas);   //Aqui que não sei o que fazer                   
            
            System.out.println(idCurriculo_Disciplinas);
        }   
                   
        dataSetDisciplinesPrint.flush();
        dataSetDisciplinesPrint.close();

Já tentei de tudo, com MAP e sem MAP, sem HashSet. Já tentei com Pattern e Matcher. Enfim, não sei como resolver isso. Se alguém puder me dar algumas dicas.

Caro Jefferson,

Experimente fazer as seguinte alterações na declaração da variável idCurriculo_Disciplinas e dentro do seu laço de leitura:

[code]

Map<String, HashSet> idCurriculo_Disciplinas = new HashMap<String, HashSet>();

while (sc.hasNextLine()) { //Lendo o arquivo

String line = sc.nextLine();   
String[] fields = line.split(";");   
   
idCurr = fields[0];   
idDisc = fields[1];                         

if (!idCurriculo_Disciplinas.containsKey(idCurr)) {
   idCurriculo_Disciplinas.put(idCurr, new HashSet<String>());
}
idCurriculo_Disciplinas.get(idCurr).add(idDisc);
   
System.out.println(line);

} [/code]

Tenta lá. Abç =]

Muito obrigado pela ajuda jcnBorges.

Então, fiz o teste com os seus códigos, e continua acontecendo a mesma coisa que acontece com as várias tentativas que executei.

Ele agrupa todas as disciplinas em um id só

Código:

       Map<String, HashSet<String>> idCurriculo_Disciplinas = new HashMap<String, HashSet<String>>();       

        String idCurr = null;
        String idDisc = null;

        while (sc.hasNextLine()) {                        
            String line = sc.nextLine();
            String[] fields = line.split(";");
            
            idCurr = fields[0];
            idDisc = fields[1];                      
          
            if (!idCurriculo_Disciplinas.containsKey(idCurr)) {
                idCurriculo_Disciplinas.put(idCurr, new HashSet<String>());
            }
            
            idCurriculo_Disciplinas.get(idCurr).add(idDisc);
           
           System.out.println(idCurriculo_Disciplinas); 
        }   

Saida:
{31.02.001=[GAN00166, TCC00182, GAN00140, TCC00181, TCC00180, TCC00186, TCC00164, TCC00185, TET00185, TCC00184, TCC00183, TCC00168, TCC00167, TCC00166, TCC00188, GMA00111, TCC00187, TCC00215, TCC00171, TCC00192, TCC00170, GMA00109, TCC00191, TCC00175, GET00122, TCC00174, TCC00172, TCC00179, GMA00121, TCC00178, TCC00177, TCC00176, GFI00138, GFI00158, GFI00159], 31.01.002=[TCC04040, TCC04021, TCC04086, TCC05072, TCC04081, TCC04080, TCC04083, TCC04082, TCC04148, TCC04026, TCC04147, TCC04128, TCC04028, TCC04023, TCC04144, TCC04022, TCC04066, TET05058, TCC04146, TCC04145, TCC04068, TCC03078, GMA06071, GMA06074, TCC04074, GET04021, TCC04073, TCC04131, TCC04076, GAN04137, TCC04130, TCC04075, TCC04091, TET04059, TCC04133, TCC04077, TCC04132, TCC04036, TCC04134, TCC04079, GFI05102, GFI05103, GFI05100, TCC04129, GFI05101, TCC04090], 31.01.001=[TCC04021, TCC04020, STA04005, TCC04027, TCC04026, TCC04029, TCC04028, TCC04023, TCC04022, TET05058, TCC04025, TCC04024, GLC04031, TCC04019, TCC04050, GMA04002, GET04007, TCC04015, TET04059, GET04009, TCC04018, TCC04017, TCC04012, TCC04011, TCC04058, TCC04014, GMA04003, TCC04013, TCC04009, TCC04041, TCC04040, TCC04043, TCC04042, GLE06055, TCC04005, TCC04001, GFI06003, GFI06002, SAD04019, TCC04032, TCC04153, TCC04031, TCC04038, TCC04037, GCC04007, TCC04039, TCC04034, TCC04033, TCC04036, TCC04035]}

No meu CSV existem, atualmente, três códigos de cursos distintos: 31.01.001, 31.01.002 e 31.02.001

Ele sempre está agrupando tudo no 31.02.001

[quote=JeffersonJCosta]No meu CSV existem, atualmente, três códigos de cursos distintos: 31.01.001, 31.01.002 e 31.02.001

Ele sempre está agrupando tudo no 31.02.001[/quote]

Jefferson,

Verifique a sua saída:

{31.02.001=[GAN00166, TCC00182, GAN00140, TCC00181, TCC00180, TCC00186, TCC00164, TCC00185, TET00185, TCC00184, TCC00183, TCC00168, TCC00167, TCC00166, TCC00188, GMA00111, TCC00187, TCC00215, TCC00171, TCC00192, TCC00170, GMA00109, TCC00191, TCC00175, GET00122, TCC00174, TCC00172, TCC00179, GMA00121, TCC00178, TCC00177, TCC00176, GFI00138, GFI00158, GFI00159], 31.01.002=[TCC04040, TCC04021, TCC04086, TCC05072, TCC04081, TCC04080, TCC04083, TCC04082, TCC04148, TCC04026, TCC04147, TCC04128, TCC04028, TCC04023, TCC04144, TCC04022, TCC04066, TET05058, TCC04146, TCC04145, TCC04068, TCC03078, GMA06071, GMA06074, TCC04074, GET04021, TCC04073, TCC04131, TCC04076, GAN04137, TCC04130, TCC04075, TCC04091, TET04059, TCC04133, TCC04077, TCC04132, TCC04036, TCC04134, TCC04079, GFI05102, GFI05103, GFI05100, TCC04129, GFI05101, TCC04090], 31.01.001=[TCC04021, TCC04020, STA04005, TCC04027, TCC04026, TCC04029, TCC04028, TCC04023, TCC04022, TET05058, TCC04025, TCC04024, GLC04031, TCC04019, TCC04050, GMA04002, GET04007, TCC04015, TET04059, GET04009, TCC04018, TCC04017, TCC04012, TCC04011, TCC04058, TCC04014, GMA04003, TCC04013, TCC04009, TCC04041, TCC04040, TCC04043, TCC04042, GLE06055, TCC04005, TCC04001, GFI06003, GFI06002, SAD04019, TCC04032, TCC04153, TCC04031, TCC04038, TCC04037, GCC04007, TCC04039, TCC04034, TCC04033, TCC04036, TCC04035]}

Destaquei em negrito como o Java agrupou as coleções.

Seu map está correto.

Use idCurriculo_Disciplinas.get() para pegar uma delas em particular.

Abç.

Desculpa, agora que fui perceber, só quando você destacou aqui para mim.

Muito obrigado.

Estou há tanto tempo em cima desse erro que esse detalhe passou despercebido por mim.

Muito obrigado pela ajuda.

Vou dar continuidade aos trabalhos aqui. Qualquer dúvida nova, posto outro topico.
Esse está resolvido.

Forte abraço.

Jefferson,

Legal que o problema está resolvido =]

O pessoal da comunidade está sempre me ajudando com dúvidas também. Fico contente que dessa vez eu tenha ajudado.

\o