有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

列出Java获取对象的arrayList中最常见的元素

我有一个ArrayList看起来像这样:

ArrayList<TravelData> listOfTravels;

TravelData对象包含以下元素

int id;
String groupName;
String guideName;

以下是我初始化arrayList的方式:

listOfTravels.add(new TravelData(1,"group a", "Ross"));
listOfTravels.add(new TravelData(2,"group a", "Chandler"));
listOfTravels.add(new TravelData(3,"group a", "Monica"));
listOfTravels.add(new TravelData(4,"group b", "Phoebe"));
listOfTravels.add(new TravelData(5,"group b", "Rachel"));
listOfTravels.add(new TravelData(6,"group c", "Joey"));
listOfTravels.add(new TravelData(7,"group c", "Rachel"));
listOfTravels.add(new TravelData(8,"group d", "Chandler"));

我想获得该列表中最常见的3个组和指南。 在本例中:

Top 3 groups: "group a", "group b", "group c"
Top 3 guides: "Rachel", "Chandler", "Ross"

(导游的第三名可能是其他人,因为罗斯、莫妮卡、菲比和乔伊的出场次数相同)

我找到了像how to get the most common element in a list这样的好答案,但它只适用于ArrayList个整数,并且只显示第一个最常见的元素


共 (4) 个答案

  1. # 1 楼答案

    试试这个,它会帮你的

    public class TravelData {
    int id;
    String groupName;
    public String getGroupName() {
        return groupName;
    }
    
    public String getGuideName() {
        return guideName;
    }
    
    String guideName;
    
    public TravelData(int id, String groupName, String guideName) {
        this.id = id;
        this.groupName = groupName;
        this.guideName = guideName;
    }
    
    public static void getcommonGroups(ArrayList<TravelData>  list){
        Map<String, Integer> wordMap = new HashMap<String, Integer>();
    
        for(TravelData td:list){
            if(wordMap.containsKey(td.getGroupName())){
                wordMap.put(td.getGroupName(), wordMap.get(td.getGroupName())+1);
            } else {
                wordMap.put(td.getGroupName(), 1);
            }
        }
    
        List<Map.Entry<String, Integer>> sortedList = sortByValue(wordMap);
        for(Map.Entry<String, Integer> entry:sortedList){
            System.out.println(entry.getKey()+" ===="+entry.getValue());
        } }
    
      public static List<Map.Entry<String, Integer>> sortByValue(Map<String, Integer> 
      wordMap)  {
    
        Set<Map.Entry<String, Integer>> set = wordMap.entrySet();
        List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(set);
        Collections.sort( list, new Comparator<Map.Entry<String, Integer>>()
        {
            public int compare( Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2 )
            {
                return (o2.getValue()).compareTo( o1.getValue() );
            }
        } );
        return list;
    }
    
    
    public static  void main(String args[]){
        ArrayList<TravelData> listOfTravels=new ArrayList() ;
        listOfTravels.add(new TravelData(1,"group a", "Ross"));
        listOfTravels.add(new TravelData(2,"group a", "Chandler"));
        listOfTravels.add(new TravelData(3,"group a", "Monica"));
        listOfTravels.add(new TravelData(4,"group b", "Phoebe"));
        listOfTravels.add(new TravelData(5,"group b", "Rachel"));
        listOfTravels.add(new TravelData(6,"group c", "Joey"));
        listOfTravels.add(new TravelData(7,"group c", "Rachel"));
        listOfTravels.add(new TravelData(8,"group d", "Chandler"));
        getcommonGroups(listOfTravels);
    }}
    
  2. # 2 楼答案

    您可以为groups创建一个hashMap结构,其中key将是groupName,值将是发生的次数

    然后,只需sort按值descendinghashMap结构进行descending运算并得到结果

  3. # 3 楼答案

    这是流的一个很好的用例。其思想是,首先将组的List<TravelData>转换为Map<String, Integer>再转换为引导数(或引导到组数),然后按数字对该映射进行排序,只取映射的键(组/引导),并将其限制为前三个元素

    我假设TravelData有String getGroup()String getGuide()方法:

    Using Java 11 type inference in the example

    final comparator = Comparator.comparing(Map::getValue)
                                 .reversed();
    
    final top3Groups = listOfTravels.stream().collect(Collectors.groupingBy(TravelData::getGroup(),
                                                                            Collectors.counting())
                                    .entrySet()
                                    .stream().sorted(comparator)
                                             .map(Map::getKey)
                                             .limit(3)
                                             .collect(Collectors.toList());
    
    final top3Guides = listOfTravels.stream().collect(Collectors.groupingBy(TravelData::getGuide(),
                                                                            Collectors.counting())
                                    .entrySet()
                                    .stream().sorted(comparator)
                                             .map(Map::getKey)
                                             .limit(3)
                                             .collect(Collectors.toList());
    
  4. # 4 楼答案

    以下是我对Streams的解决方案

    // comparator for reverse sorting
    Comparator<Map.Entry<String, Long>> reversed = Map.Entry.comparingByValue();
    Comparator<Map.Entry<String, Long>> entryComparator = Collections.reverseOrder(reversed);
    
    List<String> collect = listOfTravels.stream()
            .collect(Collectors.groupingBy(TravelData::getGuideName, Collectors.counting()))
            .entrySet()
            .stream()
            .sorted(entryComparator)
            .map(Map.Entry::getKey)
            .limit(3)
            .collect(Collectors.toList());
    System.out.println(collect);