Preciso agrupar uma lista de objetos (Aluno) usando um atributo (Localização) do objeto em particular, o código é como abaixo,
public class Grouping {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
List<Student> studlist = new ArrayList<Student>();
studlist.add(new Student("1726", "John", "New York"));
studlist.add(new Student("4321", "Max", "California"));
studlist.add(new Student("2234", "Andrew", "Los Angeles"));
studlist.add(new Student("5223", "Michael", "New York"));
studlist.add(new Student("7765", "Sam", "California"));
studlist.add(new Student("3442", "Mark", "New York"));
//Code to group students by location
/* Output should be Like below
ID : 1726 Name : John Location : New York
ID : 5223 Name : Michael Location : New York
ID : 4321 Name : Max Location : California
ID : 7765 Name : Sam Location : California
*/
for (Student student : studlist) {
System.out.println("ID : "+student.stud_id+"\t"+"Name : "+student.stud_name+"\t"+"Location : "+student.stud_location);
}
}
}
class Student {
String stud_id;
String stud_name;
String stud_location;
Student(String sid, String sname, String slocation) {
this.stud_id = sid;
this.stud_name = sname;
this.stud_location = slocation;
}
}
Por favor, me sugira uma maneira limpa de fazer isso.
Respostas:
Isto irá adicionar o objeto estudantes ao
HashMap
comlocationID
como chave.Repita este código e adicione alunos ao
HashMap
:Se quiser todos os alunos com detalhes de localização específicos, você pode usar isto:
o que levará você a todos os alunos com a mesma identificação de local.
fonte
Em Java 8:
fonte
Student
classestud_location
é especificado como Amigável. Apenas aStudent
classe e qualquer classe definida no mesmo pacote deStudent
pode acessarstud_location
. Se você colocar empublic String stud_location;
vez deString stud_location;
, isso deve funcionar. Ou você pode definir uma função getter. Mais informações em cs.princeton.edu/courses/archive/spr96/cs333/java/tutorial/java/…fonte
Usando Java 8
O resultado será:
fonte
Java 8 groupingBy Collector
Provavelmente é tarde, mas gosto de compartilhar uma ideia melhorada para este problema. Esta é basicamente a mesma resposta de @Vitalii Fedorenko, mas é mais fácil de brincar.
Você pode apenas usar o
Collectors.groupingBy()
passando a lógica de agrupamento como parâmetro de função e você obterá a lista dividida com o mapeamento de parâmetro-chave. Observe que o usoOptional
é usado para evitar o NPE indesejado quando a lista fornecida énull
Agora você pode agrupar por qualquer coisa com isso. Para o caso de uso aqui na questão
Map<String, List<Student>> map = groupBy(studlist, Student::getLocation);
Talvez você queira dar uma olhada neste também Guia para agrupamento de Java 8 por coletor
fonte
Você pode usar o seguinte:
//impressão
fonte
Implemente o recurso SQL GROUP BY em Java usando o Comparator, o comparator irá comparar os dados da coluna e classificá-los. Basicamente, se você mantém os dados classificados que parecem dados agrupados, por exemplo, se você tem os mesmos dados de coluna repetidos, o mecanismo de classificação classifica-os mantendo os mesmos dados de um lado e, em seguida, procura outros dados que são dados diferentes. Isso é visto indiretamente como GROUPING dos mesmos dados.
A saída está aqui para a lista de ProductBean acima feita com os critérios GROUP BY, aqui se você ver os dados de entrada que são fornecidos com a lista de ProductBean para Collections.sort (lista, objeto de Comparador para sua coluna necessária) Isso será classificado com base na implementação de seu comparador e você poderá ver os dados GROUPED na saída abaixo. Espero que isto ajude...
fonte
Você pode classificar assim:
Supondo que você também tenha o getter para localização em sua classe de aluno.
fonte
Você poderia fazer isso:
as chaves serão os locais e a lista de valores dos alunos. Mais tarde, você pode obter um grupo de alunos apenas usando:
fonte
você pode usar
guava
o deMultimaps
imprimir:
fonte
Se você quiser adicionar vários objetos para agrupar por, basta adicionar o objeto no
compositKey
método separando por vírgula:fonte
fonte