如何在List和我的列表中搜索如下所示:List< Object>

How to search in an List and my List is look like : List<Object> myList = new ArrayList<Object>()

本问题已经有最佳答案,请猛点这里访问。

我想在列表中搜索,我的列表看起来像

1
2
3
4
5
6
7
8
List<Employee> oneEmp= new ArrayList<Employee>();
List<Employee> twoEmp= new ArrayList<Employee>();



oneEmp= [Employee [eid=1001, eName=Sam Smith, eAddress=Bangluru, eSalary=10000000], Employee [eid=0, eName=, eAddress=, eSalary=null], Employee [eid=1003, eName=Amt Lime, eAddress=G Bhagyoday, eSalary=200000], Employee [eid=1004, eName=Ash Wake, eAddress=BMC, eSalary=200000], Employee [eid=1005, eName=Will Smith, eAddress= Delhi, eSalary=200000], Employee [eid=1006, eName=Shya Ymwar, eAddress=Madras, eSalary=50000], Employee [eid=1007, eName=Nag Gam, eAddress=Pune, eSalary=10000000], Employee [eid=1008, eName=Arti, eAddress=Delhi, eSalary=10000000]]

twoEmp= [Employee [eid=0, eName=null, eAddress=null, eSalary=100000], Employee [eid=0, eName=null, eAddress=null, eSalary=50000], Employee [eid=0, eName=null, eAddress=null, eSalary=200000]]

我使用的代码如下:

1
2
3
4
5
6
7
8
for(Employee two : twoEmp){
        for (Iterator<Employee> iterator = oneEmp.iterator(); iterator.hasNext(); ) {
        Employee e = iterator.next();
        if (e.geteSalary() != null && two.geteSalary() != null && e.geteSalary().compareTo(two.geteSalary()) == 0) {
            finalEmpList.add(e);
        }
        }
    }

但这仍然需要2个循环

I am using JAVA 1.6

我的员工类具有以下属性:

1
2
3
4
//Employee class
int eid;
BigInteger eSalary;
String eName, eAddress;

现在我要得到列表中的所有对象,他们的薪水=10000000

结果应该是:

[员工[eid=1001,ename=sam smith,eaddress=bangluru,esalary=10000000],员工[eid=1007,ename=nag gam,eaddress=pune,esalary=10000000],员工[eid=1008,ename=arti,eaddress=德里,esalary=10000000],

我希望在不使用任何循环或所需的最小循环的情况下实现这一点,因为数据将很大


是的,可以避免使用流进行循环。

首先,考虑使用通用集合:

1
2
List<Employee> employees = new ArrayList<>():
//add all employees to the list

现在您可以使用流来筛选列表

1
2
3
List<Employee> filtered = employees.stream()    
            .filter(emp -> emp.getSalary() == 10000000)
            .collect(Collectors.toList());

编辑:可能流库内部仍在使用某种循环,但我不担心它的实现对我来说是隐藏的。


列表是一个连续的容器,要对列表进行任何类型的筛选,您唯一的选择是对它进行迭代。

对于您提到的查询,您可以使用映射数据结构,其中键(表示工资)的类型为BigInteger,映射值类型的类型为List。这将使您能够在不必重复整个列表的情况下,查找所有在固定时间内获得一定薪水的员工。

不幸的是,这个解决方案不能帮助您执行任何其他查询,比如"有多少员工的收入超过60000",以便对您应该使用数据库的大型数据集执行所有类型的查询。

附言:除非你认为某人的收入超过2147483647,否则你不需要使用BigInteger类型的工资。


类似这样的方法应该可以做到这一点:遍历列表,删除不需要的项,只留下需要的项。

1
2
3
4
5
6
7
8
9
10
11
12
List myList = new ArrayList(); //... add items

[...]

for (Iterator<Employee> iterator = myList.iterator(); iterator.hasNext(); ) {
    Employee e = iterator.next();
    if (e.getSalary() != 10000000) {
        iterator.remove();
    }
}

//your list now contains only employees whose salary = 10000000

编辑:不,没有循环就不能这样做。为了完成这类工作,必须使用循环对集合进行迭代。即使使用库或Java流API来执行此操作,它仍将在引擎盖下使用某种类型的循环。然而,这将是相当有效的,即使有大的数据集。(有多大?为什么要避免使用循环?)