Java中通用列表的筛选和排序项
我正在为web应用程序实现搜索、排序和分页逻辑,我需要找到一种高效且可能不冗长的方法来对泛型类型列表(Java中通用列表的筛选和排序项,java,collections,guava,Java,Collections,Guava,我正在为web应用程序实现搜索、排序和分页逻辑,我需要找到一种高效且可能不冗长的方法来对泛型类型列表(list)的项进行排序和筛选。我希望动态地传递列表排序所依据的字段(例如,作为字符串) 使用Guava库是一个好主意还是使用标准java库可以达到同样的效果?我从未使用过Guava,如果我只将它们用于次要的实用程序,我会避免在我的项目中添加额外的库 注意,我的项目中也使用了Spring。是否有一些有用的实用程序来处理集合 在.NET应用程序中,我通常使用LINQ来操作和查询集合,我希望找到类似的
list
)的项进行排序和筛选。我希望动态地传递列表排序所依据的字段(例如,作为字符串)
使用Guava库是一个好主意还是使用标准java库可以达到同样的效果?我从未使用过Guava,如果我只将它们用于次要的实用程序,我会避免在我的项目中添加额外的库
注意,我的项目中也使用了Spring。是否有一些有用的实用程序来处理集合
在.NET应用程序中,我通常使用LINQ来操作和查询集合,我希望找到类似的方法,或者至少是这种方法的简单替代方法。。。你能帮我吗
注意
我需要按任意字段对自定义对象进行排序,因此如果我有一个
Person
对象,其中包含name
、姓氏
和年龄
字段,我需要按其中一个字段对列表进行排序。标准Java库提供集合。sort()
用于一次性排序,而TreeSet
和TreeMap
用于永久排序的集合
集合中的对象需要实现Compariable(在这种情况下,上述所有操作的默认行为都是使用自然排序),或者您可以为排序操作指定一个
比较器(或树*
)。如果您确实指定了一个比较器,它将超越默认的排序行为并完全替换它。Arrays.sort将很好地处理排序
在过滤的情况下,只要使用比较器,hashcode/equals就可以使用TreeSet等
番石榴也做同样的事情,不管怎样,拥有番石榴也是一件好事,因为这个库包含的不仅仅是收藏。您可以编写自己的自定义比较器进行排序。编写比较器时,可以使用Collections.sort()
方法按照compare()
方法中定义的方式对其进行排序。
compare()
方法应该与equals()
方法类似。如在。如果两个对象相等,那么它们应该比较为相等
直接来自Java文档。
当使用比较器时,应谨慎使用,比较器能够对排序集(或排序映射)施加与等于不一致的排序。假设一个带有显式比较器c的排序集(或排序映射)与从集合S中提取的元素(或键)一起使用。如果c对S施加的顺序与equals不一致,则排序集(或排序映射)的行为将“奇怪”。特别是排序集(或排序映射)将违反集合(或映射)的一般约定,它的定义是平等的
第一,基于3个不同参数的方法也是,写3个不同的比较器
public class FirstNameComparator implements Comparator<Person>{
public int compare(Person person1, Person person2) {
return person1.getFirstName().compareTo(person2.getFirstName());
}
public class LastNameComparator implements Comparator<Person>{
public int compare(Person person1, Person person2) {
return person1.getLastName().compareTo(person2.getLastName());
}
假设人员是人员列表
除了这里的(很棒的)答案之外,使用Java8,您可以通过以下方式使用比较器:myPersons.sort(comparator.comparating(MyPerson::getAge))代码>
我编写的完整代码,例如:
public class Java8Comparator {
public static void main(String[] args) {
List<MyPerson> myPersons = getPersons();
System.out.println("Before Sort...");
myPersons.forEach(myPerson ->
System.out.println("Person: " + myPerson.getFirstName() + " with salary: " + myPerson.getSalary() + " and age: " + myPerson.getAge()));
myPersons.sort(Comparator.comparing(MyPerson::getAge));
myPersons.sort(Comparator.comparing(MyPerson::getFirstName));
myPersons.sort(Comparator.comparing(MyPerson::getSalary));
System.out.println("After Sort...");
myPersons.forEach(myPerson ->
System.out.println("Person: " + myPerson.getFirstName() + " with salary: " + myPerson.getSalary() + " and age: " + myPerson.getAge()));
}
private static List<MyPerson> getPersons() {
List<MyPerson> result = new ArrayList<>();
result.add(new MyPerson("saul", new BigDecimal("86000"), 54));
result.add(new MyPerson("mahmud", new BigDecimal("67000"), 21));
result.add(new MyPerson("hillary", new BigDecimal("120000"), 46));
result.add(new MyPerson("mickel", new BigDecimal("180000"), 25));
result.add(new MyPerson("donald", new BigDecimal("140000"), 17));
return result;
}
}
class MyPerson {
private String firstName;
private BigDecimal salary;
private int age;
public MyPerson(String firstName, BigDecimal salary, int age) {
this.firstName = firstName;
this.salary = salary;
this.age = age;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public BigDecimal getSalary() {
return salary;
}
public void setSalary(BigDecimal salary) {
this.salary = salary;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
公共类Java8Comparator{
公共静态void main(字符串[]args){
List myPersons=getPersons();
System.out.println(“排序前…”);
myPerson.forEach(myPerson->
System.out.println(“Person:+myPerson.getFirstName()+”,工资:+myPerson.getSalary()+,年龄:+myPerson.getAge());
排序(Comparator.comparing(MyPerson::getAge));
排序(Comparator.comparing(MyPerson::getFirstName));
排序(Comparator.comparing(MyPerson::getSalary));
System.out.println(“排序后…”);
myPerson.forEach(myPerson->
System.out.println(“Person:+myPerson.getFirstName()+”,工资:+myPerson.getSalary()+,年龄:+myPerson.getAge());
}
私有静态列表getPersons(){
列表结果=新建ArrayList();
结果。添加(新MyPerson(“saul”),新BigDecimal(“86000”),54);
结果。添加(新MyPerson(“mahmud”),新BigDecimal(“67000”),21);
结果。添加(新MyPerson(“hillary”),新BigDecimal(“120000”),46);
结果。添加(新MyPerson(“mickel”),新BigDecimal(“180000”),25);
结果。添加(新MyPerson(“donald”),新BigDecimal(“140000”),17);
返回结果;
}
}
类MyPerson{
私有字符串名;
私人薪酬;
私人互联网;
公共MyPerson(字符串firstName,bigdecime salary,int age){
this.firstName=firstName;
这个。薪水=薪水;
这个。年龄=年龄;
}
公共字符串getFirstName(){
返回名字;
}
public void setFirstName(字符串firstName){
this.firstName=firstName;
}
公共工资(){
返回工资;
}
公共无效设置薪资(大十进制薪资){
这个。薪水=薪水;
}
公共整数getAge(){
回归年龄;
}
公共无效设置(整数){
这个。年龄=年龄;
}
}
如果我没有弄错的话,番石榴是开源的,那么你可以看看它们是如何实现的。。。
public class Java8Comparator {
public static void main(String[] args) {
List<MyPerson> myPersons = getPersons();
System.out.println("Before Sort...");
myPersons.forEach(myPerson ->
System.out.println("Person: " + myPerson.getFirstName() + " with salary: " + myPerson.getSalary() + " and age: " + myPerson.getAge()));
myPersons.sort(Comparator.comparing(MyPerson::getAge));
myPersons.sort(Comparator.comparing(MyPerson::getFirstName));
myPersons.sort(Comparator.comparing(MyPerson::getSalary));
System.out.println("After Sort...");
myPersons.forEach(myPerson ->
System.out.println("Person: " + myPerson.getFirstName() + " with salary: " + myPerson.getSalary() + " and age: " + myPerson.getAge()));
}
private static List<MyPerson> getPersons() {
List<MyPerson> result = new ArrayList<>();
result.add(new MyPerson("saul", new BigDecimal("86000"), 54));
result.add(new MyPerson("mahmud", new BigDecimal("67000"), 21));
result.add(new MyPerson("hillary", new BigDecimal("120000"), 46));
result.add(new MyPerson("mickel", new BigDecimal("180000"), 25));
result.add(new MyPerson("donald", new BigDecimal("140000"), 17));
return result;
}
}
class MyPerson {
private String firstName;
private BigDecimal salary;
private int age;
public MyPerson(String firstName, BigDecimal salary, int age) {
this.firstName = firstName;
this.salary = salary;
this.age = age;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public BigDecimal getSalary() {
return salary;
}
public void setSalary(BigDecimal salary) {
this.salary = salary;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}