java怎么统计类别的数量

java怎么统计类别数量,一个list里有苹果雪梨香蕉,小猫小狗,顺序是乱的,苹果雪梨香蕉属于水果类,分类加一,小猫小狗属于动物类,分类加一,总共有2种类别。怎么实现代码

要统计类别的数量,可以使用Java中的HashMap来实现。以下是一个示例代码,展示了如何统计一个List中不同类别的数量:

import java.util.*;

public class CategoryCount {
    public static void main(String[] args) {
        List<String> items = Arrays.asList("苹果", "雪梨", "香蕉", "小猫", "小狗");

        Map<String, Integer> categoryCount = new HashMap<>();

        for (String item : items) {
            String category = getCategory(item); // 根据具体逻辑获取类别
            categoryCount.put(category, categoryCount.getOrDefault(category, 0) + 1);
        }

        System.out.println("不同类别的数量:");
        for (Map.Entry<String, Integer> entry : categoryCount.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }

    private static String getCategory(String item) {
        // 根据具体逻辑判断类别,并返回类别名
        if (item.equals("苹果") || item.equals("雪梨") || item.equals("香蕉")) {
            return "水果";
        } else {
            return "动物";
        }
    }
}

在上述示例中,首先定义了一个List items,包含了不同的元素。然后创建了一个HashMap categoryCount,用于存储不同类别的数量。接下来通过遍历List中的每个元素,调用getCategory()方法获取元素对应的类别,并更新HashMap中对应类别的数量。最后,通过遍历HashMap,打印出不同类别的数量。

请注意,在示例代码中的getCategory()方法中,根据具体逻辑判断了两个类别:水果和动物。您可以根据实际需求自定义该方法,并添加更多的类别判断条件。

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/263291
  • 除此之外, 这篇博客: 这些Java8官方挖过的坑,你踩过几个?中的 四、List:一如你我初见,不增不减 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 这个问题其实在JDK里存在很多年了,JDK8中依然存在,也是很多人最容易跳的一个坑!直接上代码:

    public List<String> allUser() {
        // 省略
        List<String> currentUserList = getUser();
        currentUserList.add("码大叔");
        // 省略
    }
    

    就是上面这样一段代码,往一个list里添加一条数据,你觉得结果是什么呢?“码大叔”成功地添加到了List里?天真,不报个错你怎么能意识到JDK存在呢。

    Exception in thread "main" java.lang.UnsupportedOperationException
        at java.util.AbstractList.add(AbstractList.java:148)
    

    原因
    因为在getUser方法里,返回的List使用的是Arrays.asList生成的,示例:

        private List<String> getUser(){
            return Arrays.asList("剑圣","小九九");
        }
    

    我们来看看Arrays.asList的源码

        @SafeVarargs
        @SuppressWarnings("varargs")
        public static <T> List<T> asList(T... a) {
            return new ArrayList<>(a);
        }
    
     private static class ArrayList<E> extends AbstractList<E>
            implements RandomAccess, java.io.Serializable
        {
       		private final E[] a;
            // 部分代码略
            ArrayList(E[] array) {
                // 返回的是一个定长的数组
                a = Objects.requireNonNull(array);
            }
            // 部分代码略
       }
    

    很明显,返回的实际是一个定长的数组,所以只能“一如你我初见”,初始化什么样子就什么样子,不能新增,不能减少。如果你理解了,那我们就再来一个栗子

       int[] intArr  = {1,2,3,4,5};
       Integer[] integerArr  = {1,2,3,4,5};
       String[] strArr = {"1", "2", "3", "4", "5"};
       List list1 = Arrays.asList(intArr);
       List list2 = Arrays.asList(integerArr);
       List list3 = Arrays.asList(strArr);
       System.out.println("list1中的数量是:" + list1.size());
       System.out.println("list2中的数量是:" + list2.size());
       System.out.println("list3中的数量是:" + list3.size());
    

    你觉得答案是什么?预想3秒钟,揭晓答案,看跟你预想的是否一致呢?

    list1中的数量是:1
    list2中的数量是:5
    list3中的数量是:5
    

    是不是和你预想又不一样了?还是回到Arrays.asList方法,该方法的输入只能是一个泛型变长参数。基本类型是不能泛型化的,也就是说8个基本类型不能作为泛型参数,要想作为泛型参数就必须使用其所对应的包装类型,那前面的例子传递了一个int类型的数组,为何程序没有报编译错误呢?在Java中,数组是一个对象,它是可以泛型化的,也就是说我们的例子是把一个int类型的数组作为了T的类型,所以在转换后在List中就只有1个类型为int数组的元素了。除了int,其它7个基本类型的数组也存在相似的问题。

    JDK里还为我们提供了一个便捷的集合操作工具类Collections,比如多个List合并时,可以使用Collections.addAll(list1,list2), 在使用时也同样要时刻提醒自己:“请勿踩坑”!

  • 您还可以看一下 钟林森老师的Java实战之Redis入门到精通课程中的 列表List实战之借助队列特性实现多线程发送邮件一小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    解决方案

    根据你的需求,你可以通过以下步骤编写一个Java程序来统计列表中不同类别的数量:

    1. 创建一个Item类作为列表中每个项目的基类,包括一个成员变量category表示类别。
    class Item {
       protected String category;
    
       public Item(String category) {
          this.category = category;
       }
    }
    
    1. 创建一个Fruit类和一个Animal类作为Item类的子类,分别表示水果和动物项目。
    class Fruit extends Item {
       public Fruit(String category) {
          super(category);
       }
    }
    
    class Animal extends Item {
       public Animal(String category) {
          super(category);
       }
    }
    
    1. 创建一个 Counter 类来统计不同类别的数量。该类包括一个count方法来统计列表中不同类别的数量。
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    class Counter {
       public Map<String, Integer> count(List<Item> items) {
          Map<String, Integer> categoryCount = new HashMap<>();
          for (Item item : items) {
             String category = item.category;
             categoryCount.put(category, categoryCount.getOrDefault(category, 0) + 1);
          }
          return categoryCount;
       }
    }
    
    1. 在主程序中使用示例数据来测试Counter类的功能。
    import java.util.ArrayList;
    import java.util.List;
    
    public class Main {
       public static void main(String[] args) {
          List<Item> items = new ArrayList<>();
          items.add(new Fruit("苹果"));
          items.add(new Fruit("香蕉"));
          items.add(new Fruit("苹果"));
          items.add(new Animal("小狗"));
          items.add(new Animal("小猫"));
    
          Counter counter = new Counter();
          Map<String, Integer> categoryCount = counter.count(items);
    
          for (Map.Entry<String, Integer> entry : categoryCount.entrySet()) {
             String category = entry.getKey();
             int count = entry.getValue();
             System.out.println(category + ": " + count);
          }
       }
    }
    

    这样就可以使用Java编写一个程序来统计列表中不同类别的数量了。示例代码中通过定义Item类及其子类FruitAnimal来表示列表中的项目,Counter类用于统计不同类别的数量。在主程序中,我们创建一个带有水果和动物项目的列表,并通过Counter类统计并输出不同类别的数量。

    请注意,示例代码只是一种可能的实现方式,并且可能需要根据你的实际需求进行适当的修改。

用集合实现,map类型实现


 List<String> items = Arrays.asList("苹果", "小猫", "香蕉", "小狗", "雪梨");

        // 创建一个HashMap来存储每个类别的数量
        Map<String, Integer> categoryCount = new HashMap<>();

        // 遍历列表中的每个项
        for (String item : items) {
            // 判断类别,并增加对应类别的计数
            if (isFruit(item)) {
                categoryCount.put("水果", categoryCount.getOrDefault("水果", 0) + 1);
            } else if (isAnimal(item)) {
                categoryCount.put("动物", categoryCount.getOrDefault("动物", 0) + 1);
            }
            // 如果还有其他类别,可以在这里继续判断和增加计数
        }

        // 输出每个类别的数量
        for (Map.Entry<String, Integer> entry : categoryCount.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }

    // 判断是否为水果类别
    private static boolean isFruit(String item) {
        // 假设苹果、雪梨和香蕉属于水果类
        return item.equals("苹果") || item.equals("雪梨") || item.equals("香蕉");
    }

    // 判断是否为动物类别
    private static boolean isAnimal(String item) {
        // 假设小猫和小狗属于动物类
        return item.equals("小猫") || item.equals("小狗");
    }