List分类

List分为两种:

一种是java.awt.List,是一个类,一个可滚动的文本项列表,使其允许用户进行单项或多项选择。父类是Component。

List的主要方法有:

Class java.awt.List

java.lang.Object
   |
   +----java.awt.Component
           |
           +----java.awt.List

public void add(String item)-向滚动列表的末尾添加指定的项,

public void add(String item, int index)向滚动列表中索引指示的位置添加指定的项。

索引是从零开始的。如果索引值小于零,或者索引值大于或等于列表中的项数,则将该项添加到列表的末尾,

public String getItem(int index)获取与指定索引关联的项,

public String[] getItems()获取列表中的项,

public boolean isIndexSelected(int index)确定是否已选中此滚动列表中的指定项,

public void replaceItem(String newValue,int index)使用新字符串替换滚动列表中指定索引处的项,

public void removeAll()从此列表中移除所有项,public void remove(int position)从此滚动列表中移除指定位置处的项。如果选中了指定位置的项,并且该项是列表中惟一选中的项,则列表将被设置为无选择,

public void select(int index)选择滚动列表中指定索引处的项,

 

一种是java.util.List,是一个接口,一个有序可重复的的集合。用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元   素,并搜索列表中的元素。

常用的方法有:

boolean add(E e)-向列表的尾部添加指定的元素,

void add(int index, E element)-在列表的指定位置插入指定元素,E remove(int index)-移除列表中指定位置的元素

E set(int index,E element)-用指定元素替换列表中指定位置的元素

int size()-返回列表中的元素数

boolean isEmpty()-如果列表不包含元素,则返回 true。

 

List不是类,是一个借口。 ArrayList, LinkedList 是实现了这个借口的类。

List的功能方法

  List(interface): 次序是List最重要的特点;它确保维护元素特定的顺序。List为Collection添加了许多方法,使得能够向List中间插入与移除元素(只推荐LinkedList使用)。一个List可以生成ListIterator,使用它可以从两个方向遍历List,也可以从List中间插入和删除元素。

  ArrayList: 由数组实现的List。它允许对元素进行快速随机访问,但是向List中间插入与移除元素的速度很慢。ListIterator只应该用来由后向前遍历ArrayList,而不是用来插入和删除元素,因为这比LinkedList开销要大很多。

  LinkedList: 对顺序访问进行了优化,向List中间插入与删除得开销不大,随机访问则相对较慢(可用ArrayList代替)。它具有方法addFirst()、addLast()、getFirst()、getLast()、removeFirst()、removeLast(),这些方法(没有在任何接口或基类中定义过)使得LinkedList可以当作堆栈、队列和双向队列使用。

在Java中,可以使用Stream API对`List`进行分类(即根据某个属性分组),主要通过`Collectors.groupingBy()`方法实现。该方法会将流中的元素按照指定的分类函数进行分组,并返回一个`Map<K, List<T>>`对象,其中键为分组依据,值为对应的元素列表。 ### 基本用法 假设有一个`Student`类,包含`name`和`grade`属性: ```java class Student { private String name; private String grade; // 构造方法、getter和setter } ``` 若要根据学生的年级(`grade`)进行分组,代码如下: ```java List<Student> students = getStudents(); // 获取学生列表 Map<String, List<Student>> groupedByGrade = students.stream() .collect(Collectors.groupingBy(Student::getGrade)); ``` 上述代码将学生列表按年级分组,结果是一个以年级为键、对应学生列表为值的映射[^2]。 ### 多条件分组 如果需要根据多个属性进行分组,例如先按城市、再按性别对用户进行分组,可以嵌套使用`groupingBy`方法: ```java Map<String, Map<String, List<User>>> groupedByCityAndSex = userList.stream() .collect(Collectors.groupingBy(User::getCity, Collectors.groupingBy(User::getSex))); ``` 此时,外层`Map`的键是城市名,内层`Map`的键是性别,值为对应用户列表[^3]。 ### 自定义分组键 还可以通过自定义逻辑构造分组键,例如将城市与性别组合成字符串作为分组依据: ```java Map<String, List<User>> groupedByKey = userList.stream() .collect(Collectors.groupingBy(u -> u.getCity() + "-" + u.getSex())); ``` 这将生成一个以“城市-性别”为键的分组映射[^3]。 ### 排序后分组 在某些场景下,可能需要先对数据进行排序再分组。例如,先按`sort`字段排序,再按`valueSort`字段排序,然后进行分组: ```java Map<String, List<Category>> groupedAfterSorting = lista.stream() .sorted(Comparator.comparing(Category::getSort) .thenComparing(Category::getValueSort())) .collect(Collectors.groupingBy(fetchGroupTypeKey(mtg))); ``` 此方式确保了在分组前,数据已经按照指定顺序排列[^4]。 ### 通用结构示例 以下是一个更通用的结构示例,适用于任意类型的对象: ```java List<Person> people = ...; // 初始化人员列表 Map<String, List<Person>> groupedByName = people.stream() .collect(Collectors.groupingBy(Person::getName)); ``` 这将根据`Person`对象的`name`属性进行分组[^5]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值