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()
方法中,根据具体逻辑判断了两个类别:水果和动物。您可以根据实际需求自定义该方法,并添加更多的类别判断条件。
这个问题其实在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程序来统计列表中不同类别的数量:
Item
类作为列表中每个项目的基类,包括一个成员变量category
表示类别。class Item {
protected String category;
public Item(String category) {
this.category = category;
}
}
Fruit
类和一个Animal
类作为Item
类的子类,分别表示水果和动物项目。class Fruit extends Item {
public Fruit(String category) {
super(category);
}
}
class Animal extends Item {
public Animal(String category) {
super(category);
}
}
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;
}
}
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
类及其子类Fruit
和Animal
来表示列表中的项目,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("小狗");
}