亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用流檢索工資最低的員工列表

使用流檢索工資最低的員工列表

拉莫斯之舞 2023-07-28 09:43:02
我正在嘗試從員工列表中檢索工資最低的人員列表。到目前為止,我已經設法找到工資最低的員工,但如果多個員工的工資相同,我想檢索多個員工。我認為解決方案應該在一行中。因此,我無法創建一個具有最低工資的變量,而只需檢查每個變量是否為“工資小于或等于 Low_Salary”。我嘗試了這個,并且成功了。所以我相信我的問題是“.min(comparator)”只檢索最低的之一。Comparator<Employee> comparator = Comparator.comparing( Employee :: getSalary);List<Employee> lowSalary = employees.stream()               .min(comparator)               .stream()               .collect(Collectors.toList());lowSalary.forEach(System.out::println);
查看完整描述

4 回答

?
守著星空守著你

TA貢獻1799條經驗 獲得超8個贊

首先創建一個TreeMap,其鍵是工資。TreeMap按其鍵對其條目進行排序。然后獲取第一個條目,即工資最低的條目,并獲取與之相關的值。該解決方案僅迭代列表一次。它看起來是這樣的。

List<Employee>?empsWithLowestSalary?=?employees.stream()
????.collect(Collectors.groupingBy(Employee::getSalary,?TreeMap::new,?Collectors.toList()))
????.firstEntry()
????.getValue();

TreeMap將地圖元素存儲在紅黑樹中。紅黑樹中一個元素的插入成本為O(Log (n))。由于我們要插入n元素,因此該解決方案的總時間復雜度為O(n Log (n))。對于firstEntry(),它需要恒定的時間O(1),因為它分別維護一個指向樹中最左邊和最右邊葉節點的指針。最左邊的節點代表樹中的最小值,而最右邊的葉節點代表樹中的最高值。

我想到編寫一個服務于我們目的的自定義收集器。該收集器僅對 List 進行迭代一次,其運行時復雜度為 O(n),這明顯優于上述方法。此外,它允許您在一條語句中編寫客戶端代碼。它看起來是這樣的。

static <T> Collector<T, ?, List<T>> minList(Comparator<? super T> comp) {

? ? return Collector.of(ArrayList::new, (list, t) -> {

? ? ? ? int c;

? ? ? ? if (list.isEmpty() || (c = comp.compare(t, list.get(0))) == 0)

? ? ? ? ? ? list.add(t);

? ? ? ? else if (c < 0) {

? ? ? ? ? ? /*

? ? ? ? ? ? ?* We have found a smaller element than what we already have. Clear the list and

? ? ? ? ? ? ?* add this smallest element to it.

? ? ? ? ? ? ?*/

? ? ? ? ? ? list.clear();

? ? ? ? ? ? list.add(t);

? ? ? ? }

? ? }, (list1, list2) -> {

? ? ? ? if (comp.compare(list1.get(0), list2.get(0)) < 0)

? ? ? ? ? ? return list1;

? ? ? ? else if (comp.compare(list1.get(0), list2.get(0)) > 0)

? ? ? ? ? ? return list2;

? ? ? ? else {

? ? ? ? ? ? list1.addAll(list2);

? ? ? ? ? ? return list1;

? ? ? ? }

? ? });

}

這是您的客戶端代碼。


Collection<Employee> empsWithLowestSalary = employees.stream()

? ? ? ? ? ? ? ? .collect(minList(Comparator.comparing(Employee::getSalary)));


查看完整回答
反對 回復 2023-07-28
?
蕪湖不蕪

TA貢獻1796條經驗 獲得超7個贊

Integer lowestSalary = employees.stream()
.min(Comparator.comparing(Employee::getSalary))
.map(Employee::getSalary).get();

List<Employee> employeesWithLowestSalary = employees.stream()
.filter(e -> e.getSalary() == lowestSalary)
.collect(Collectors.toList());

首先查找最低工資是多少,然后過濾員工列表,以便只包含工資匹配的員工。


查看完整回答
反對 回復 2023-07-28
?
不負相思意

TA貢獻1777條經驗 獲得超10個贊

您可以按工資分組,然后檢索最低工資的員工列表:


List<Employee> employees = new ArrayList<Employee>(){{

    add(new Employee("bilbo baggins", 10));

    add(new Employee("frodo baggins", 10));

    add(new Employee("gandalf grey", 100));

}};


Map<Integer, List<Employee>> result = employees.stream().collect(groupingBy(Employee::getSalary));


List<Employee> allMin = result.entrySet().stream()

        .min(Comparator.comparing(Map.Entry::getKey))

        .map(Map.Entry::getValue)

        .orElse(Collections.emptyList());


allMin.forEach(System.out::println);

輸出


Employee{name='bilbo baggins', salary=10}

Employee{name='frodo baggins', salary=10}


查看完整回答
反對 回復 2023-07-28
?
慕村9548890

TA貢獻1884條經驗 獲得超4個贊

您可以先計算最低工資,然后根據您的情況使用Stream#filter:


int salary = 

   employees.stream()

            .min(Comparator.comparing(Employee::getSalary))

            .map(e -> e.getSalary())

            .orElse(-1);


List<Employee> emps = 

  employees.stream()

           .filter(emp -> emp.getSalary() == salary)

           .collect(Collectors.toList());


查看完整回答
反對 回復 2023-07-28
  • 4 回答
  • 0 關注
  • 232 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號