【问题标题】:How can I call second largest number from arrayList using collections如何使用集合从 arrayList 调用第二大数字
【发布时间】:2019-01-07 10:50:11
【问题描述】:

我需要ArrayList 中的最高、第二高和第三高数字。我通过调用Collections.max() 获得最大值(即最高数字),​​但我还需要第二大和第三大的值。
我的代码:

maxPartyid = 
Collections.max(electionresdashlist.get(k).getPartyNamesDTO());  //1st Highest
                         
System.out.println( "maxPartyid:::"+maxPartyid);
             
in DTO :
public class PartyNamesDTO implements Comparable<PartyNamesDTO>{

    private String partyId;
    public String getPartyId() {
        return partyId;
    }
    public void setPartyId(String partyId) {
        this.partyId = partyId;
    }
    private Integer votes;
    
    
    public Integer getVotes() {
        return votes;
    }
    public void setVotes(Integer votes) {
        this.votes = votes;
    }
    
    @Override
        public int compareTo(PartyNamesDTO emp) {
            return this.votes.compareTo(emp.getVotes());
        }
    
        public String toString(){
            return partyId;
        }
}        
             
             

【问题讨论】:

  • 排序,然后取第一、二、三、四...
  • 这里已经完成了 95% 的复杂工作,剩下的 5% 就是排序和获取第 n 个元素,你找不到怎么做。
  • 先生,您能详细解释一下吗!
  • 你看过heap吗?

标签: java arraylist collections


【解决方案1】:

再次搜索没有第一个最大值的最大值,得到第二个最大值。

【讨论】:

    【解决方案2】:

    试试这个代码:-

    Collections.sort(electionresdashlist);
    
    System.out.println( "maxPartyid:::"+electionresdashlist.get(0).getPartyNamesDTO());
    System.out.println( "2nd maxPartyid:::"+electionresdashlist.get(1).getPartyNamesDTO());
    System.out.println( "3rd maxPartyid:::"+electionresdashlist.get(2).getPartyNamesDTO());
    
    
    in DTO :
    public class PartyNamesDTO implements Comparable<PartyNamesDTO>{
    
        private String partyId;
        public String getPartyId() {
            return partyId;
        }
        public void setPartyId(String partyId) {
            this.partyId = partyId;
        }
        private Integer votes;
    
    
        public Integer getVotes() {
            return votes;
        }
        public void setVotes(Integer votes) {
            this.votes = votes;
        }
    
        @Override
            public int compareTo(PartyNamesDTO emp) {
                return this.votes.compareTo(emp.getVotes());
            }
    
            public String toString(){
                return partyId;
            }
    }  
    

    【讨论】:

      【解决方案3】:
      long largest=0, secondLargest=-1, thirdLargest=-2;
      listName.forEach(item -> {
      if(item > largest) {
          thirdLargest = secondLargest
          secondLargest = largest;
          largest = list.get(i);
        }
        if(item > secondLargest && item != largest) {
         thirdLargest = secondLargest; 
         secondLargest = item;
        }
        if(item>thirdLargest && item != secondLargest) {
         thirdLargest = item;
        }
      });
      

      其他方法是使用比较器根据投票数排列列表元素,前 3 名将为您提供结果

      【讨论】:

        【解决方案4】:

        由于您在PartyNamesDTO 上实现了Comparable 接口,因此您可以这样做

        Collections.sort(electionresdashlist)
        

        这将使您的列表根据compareTo 逻辑排序,如果您的排序是升序,那么您可以获得最大记录为

        electionresdashlist.get(electionresdashlist.size()-1);
        electionresdashlist.get(electionresdashlist.size()-2);
        electionresdashlist.get(electionresdashlist.size()-3);
        

        如果是降序排列

        【讨论】:

          【解决方案5】:

          您可以使用 java 8 流来排序和跳过不必要的元素

          list.stream().sorted(Comparator.reverseOrder()).limit(2).skip(1).findFirst()
          

          findFirst() 返回您的对象的 Optional&lt;T&gt;

          【讨论】:

            【解决方案6】:
            static void getKthHighest(List<Integer> list, int k) {
                Optional<Integer> element = list.stream().sorted(Collections.reverseOrder()).limit(k).skip(k - 1).findFirst();
                if(element.isPresent()) {
                    System.out.println(element.get());
                }
            }
            

            【讨论】:

              【解决方案7】:
              get last -1
              PartyNamesDTO tmpObj = partyList.stream().sorted(Comparator.reverseOrder()).skip(1).findFirst().get();
              
              get first-1
              PartyNamesDTO tmpObj = partyList.stream().sorted(Comparator.naturalOrder()).skip(1).findFirst().get();
              

              这可能会对你有所帮助。

              【讨论】:

                【解决方案8】:
                Integer[] arr= {80,19,32,150,2,78};
                IntStream arrstream=Arrays.stream(arr);
                OptionalInt firstmaxNum=stream.max();
                
                IntStream secondmaxstream=Arrays.stream(arr);
                OptionalInt secondMaximum=stream1.filter(s->s!=maxNum.getAsInt()).max();
                
                System.out.println(" first maximum number :" +firstmaxNum.getAsInt());
                System.out.println(" second maximum number :" +secondMaximum.getAsInt());}
                

                【讨论】:

                  【解决方案9】:
                  Integer integer2 = numbers.stream().max((x,y)->x.compareTo(y)).get();
                          
                  Integer integer3 = numbers.stream().filter(x->x<integer2).max((x,y)->x.compareTo(y)).get();
                          
                  System.out.println("Second max is: "+integer3);
                          
                  

                  【讨论】:

                    【解决方案10】:
                    list.stream().sorted(Collections.reverseOrder()).distinct().limit(2).skip(1).findFirst().get()
                    

                    【讨论】:

                      猜你喜欢
                      • 2016-01-05
                      • 2013-02-25
                      • 2023-03-22
                      • 1970-01-01
                      • 1970-01-01
                      • 2023-01-22
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多