- 类 型
- 计算机专业术语
- 区别于
- vector
- 中文名
- list
- 一般定义
- 一览表; 明细表; 目录; 名单
-
实现集合List中的元素进行排序
2016-06-14 22:08:32Collections对List集合中的数据进行排序 有时候需要对集合中的元素按照一定的规则进行排序,这就需要用到 Java中提供的对集合进行操作的工具类Collections,其中的sort方法 先看一个简单的例子: public static ...Collections对List集合中的数据进行排序
有时候需要对集合中的元素按照一定的规则进行排序,这就需要用到Java中提供的对集合进行操作的工具类Collections,其中的sort方法
先看一个简单的例子:
public static void main(String[] args) { List<Integer> nums = new ArrayList<Integer>(); nums.add(3); nums.add(5); nums.add(1); nums.add(0); System.out.println(nums); Collections.sort(nums); System.out.println(nums); }
输出结果:
[3, 5, 1, 0]
[0, 1, 3, 5]稍微复杂的List里面放一个复杂的对象
package core.java.collection.collections; public class User implements Comparable<User>{ private int score; private int age; public User(int score, int age){ super(); this.score = score; this.age = age; } public int getScore() { return score; } public void setScore(int score) { this.score = score; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public int compareTo(User o) { int i = this.getAge() - o.getAge();//先按照年龄排序 if(i == 0){ return this.score - o.getScore();//如果年龄相等了再用分数进行排序 } return i; } } public static void main(String[] args) { List<User> users = new ArrayList<User>(); users.add(new User(78, 26)); users.add(new User(67, 23)); users.add(new User(34, 56)); users.add(new User(55, 23)); Collections.sort(users); for(User user : users){ System.out.println(user.getScore() + "," + user.getAge()); } }
输出结果:
55,23
67,23
78,26
34,56
我们会发现sort(List<T>)方法中List中的T必须实现Comparable<T>接口,然后实现
compareTo()方法,该方法的返回值0代表相等,1表示大于,-1表示小于;为什么
在简单例子中没有看到实现Comparable接口呢?是因为Integer类其实自己已经实现
了Comparable接口,Java已经给我们做好了。
Collections提供的第二种排序方法sort(List<T> list, Comparator<? super T> c)
先看例子:package core.java.collection.collections; public class Students { private int age; private int score; public Students(int age, int score){ super(); this.age = age; this.score = score; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getScore() { return score; } public void setScore(int score) { this.score = score; } } public static void main(String[] args) { List<Students> students = new ArrayList<Students>(); students.add(new Students(23, 100)); students.add(new Students(27, 98)); students.add(new Students(29, 99)); students.add(new Students(29, 98)); students.add(new Students(22, 89)); Collections.sort(students, new Comparator<Students>() { @Override public int compare(Students o1, Students o2) { int i = o1.getScore() - o2.getScore(); if(i == 0){ return o1.getAge() - o2.getAge(); } return i; } }); for(Students stu : students){ System.out.println("score:" + stu.getScore() + ":age" + stu.getAge()); } }
输出结果:
score:89:age22
score:98:age27
score:98:age29
score:99:age29
score:100:age23
从上面的例子我们可以看出Students类没有实现Comparable<T>接口,只是在sort()方法
中多传入一个参数,只不过该参数是一个接口我们需要实现其compare方法。
以上就是是Java中Colelctions工具类为我们提供的两种集合排序方法。 -
使用 Java8的 stream对list数据去重,使用filter()过滤列表,list转map
2018-09-12 14:00:50list去重,根据对象某个属性、某几个属性去重 去除List中重复的String List unique = list.stream().distinct().collect(Collectors.toList()); 去除List中重复的对象 // Person 对象 public class ...list去重,根据对象某个属性、某几个属性去重
去除List中重复的String
List unique = list.stream().distinct().collect(Collectors.toList());
去除List中重复的对象
// Person 对象 public class Person { private String id; private String name; private String sex; <!--省略 get set--> }
// 根据name去重 List<Person> unique = persons.stream().collect( Collectors.collectingAndThen( Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Person::getName))), ArrayList::new) );
// 根据name,sex两个属性去重 List<Person> unique = persons.stream().collect( Collectors. collectingAndThen( Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> o.getName() + ";" + o.getSex()))), ArrayList::new) );
filter()过滤列表
List<Person> filterList = persons.stream().filter(p -> p.getSex().equals(1)).collect(Collectors.toList());
List转Map
从一个Person对象的List集合,取出
id
和name
组成一个map集合Map<String, String> collect = list.stream().collect(Collectors.toMap(p -> p.getId(), p -> p.getName()));
从 List 中取出某个属性的组成 list 集合
//1.提取出list对象中的一个属性 List<String> stIdList1 = stuList.stream().map(Person::getId).collect(Collectors.toList()); //2.提取出list对象中的一个属性并去重 List<String> stIdList2 = stuList.stream().map(Person::getId).distinct().collect(Collectors.toList());
-
pandas DataFrame数据转为list
2017-05-21 22:46:10首先使用np.array()函数把DataFrame转化为np.ndarray(),再利用tolist()函数把np.ndarray()转为list,示例代码如下:# -*- coding:utf-8-*- import numpy as np import pandas as pddata_x = pd.read_csv("E:/...首先使用np.array()函数把DataFrame转化为np.ndarray(),再利用tolist()函数把np.ndarray()转为list,示例代码如下:
# -*- coding:utf-8-*- import numpy as np import pandas as pd data_x = pd.read_csv("E:/Tianchi/result/features.csv",usecols=[2,3,4])#pd.dataframe data_y = pd.read_csv("E:/Tianchi/result/features.csv",usecols=[5]) train_data = np.array(data_x)#np.ndarray() train_x_list=train_data.tolist()#list print(train_x_list) print(type(train_x_list))
-
Java数组转List的三种方式及对比
2018-03-18 00:10:04本文介绍Java中数组转为List三种情况的优劣对比,以及应用场景的对比,以及程序员常犯的类型转换错误原因解析。前言:
本文介绍Java中数组转为List三种情况的优劣对比,以及应用场景的对比,以及程序员常犯的类型转换错误原因解析。
一.最常见方式(未必最佳)
通过
Arrays.asList(strArray)
方式,将数组转换List后,不能对List增删,只能查改,否则抛异常。关键代码:
List list = Arrays.asList(strArray);
private void testArrayCastToListError() { String[] strArray = new String[2]; List list = Arrays.asList(strArray); //对转换后的list插入一条数据 list.add("1"); System.out.println(list); }
执行结果:
Exception in thread "main" java.lang.UnsupportedOperationException at java.util.AbstractList.add(AbstractList.java:148) at java.util.AbstractList.add(AbstractList.java:108) at com.darwin.junit.Calculator.testArrayCastToList(Calculator.java:19) at com.darwin.junit.Calculator.main(Calculator.java:44)
程序在list.add(“1”)处,抛出异常:UnsupportedOperationException。
原因解析:
Arrays.asList(strArray)
返回值是java.util.Arrays
类中一个私有静态内部类java.util.Arrays.ArrayList
,它并非java.util.ArrayList
类。java.util.Arrays.ArrayList
类具有 set(),get(),contains()等方法,但是不具有添加add()
或删除remove()
方法,所以调用add()
方法会报错。使用场景:
Arrays.asList(strArray)
方式仅能用在将数组转换为List后,不需要增删其中的值,仅作为数据源读取使用。二.数组转为List后,支持增删改查的方式
通过ArrayList的构造器,将
Arrays.asList(strArray)
的返回值由java.util.Arrays.ArrayList
转为java.util.ArrayList
。关键代码:
ArrayList<String> list = new ArrayList<String>(Arrays.asList(strArray)) ;
private void testArrayCastToListRight() { String[] strArray = new String[2]; ArrayList<String> list = new ArrayList<String>(Arrays.asList(strArray)) ; list.add("1"); System.out.println(list); }
执行结果:成功追加一个元素“1”。
[null, null, 1]
使用场景:需要在将数组转换为List后,对List进行增删改查操作,在List的数据量不大的情况下,可以使用。
三.通过集合工具类Collections.addAll()方法(最高效)
通过
Collections.addAll(arrayList, strArray)
方式转换,根据数组的长度创建一个长度相同的List,然后通过Collections.addAll()
方法,将数组中的元素转为二进制,然后添加到List中,这是最高效的方法。关键代码:
ArrayList< String> arrayList = new ArrayList<String>(strArray.length); Collections.addAll(arrayList, strArray);
测试:
private void testArrayCastToListEfficient(){ String[] strArray = new String[2]; ArrayList< String> arrayList = new ArrayList<String>(strArray.length); Collections.addAll(arrayList, strArray); arrayList.add("1"); System.out.println(arrayList); }
执行结果:同样成功追加一个元素“1”。
[null, null, 1]
使用场景:需要在将数组转换为List后,对List进行增删改查操作,在List的数据量巨大的情况下,优先使用,可以提高操作速度。
注:附上
Collections.addAll()
方法源码:public static <T> boolean addAll(Collection<? super T> c, T... elements) { boolean result = false; for (T element : elements) result |= c.add(element);//result和c.add(element)按位或运算,然后赋值给result return result; }
四.Java8可通过
stream
流将3种基本类型数组转为List如果JDK版本在1.8以上,可以使用流
stream
来将下列3种数组快速转为List
,分别是int[]
、long[]
、double[]
,其他数据类型比如short[]
、byte[]
、char[]
,在JDK1.8中暂不支持。由于这只是一种常用方法的封装,不再纳入一种崭新的数组转List方式,暂时算是java流送给我们的常用工具方法吧。转换代码示例如下:
List<Integer> intList= Arrays.stream(new int[] { 1, 2, 3, }).boxed().collect(Collectors.toList()); List<Long> longList= Arrays.stream(new long[] { 1, 2, 3 }).boxed().collect(Collectors.toList()); List<Double> doubleList= Arrays.stream(new double[] { 1, 2, 3 }).boxed().collect(Collectors.toList());
如果是String数组,可以使用
Stream
流这样转换:String[] arrays = {"tom", "jack", "kate"}; List<String> stringList= Stream.of(arrays).collect(Collectors.toList());
--------------------------------------正文结束,以下是对评论中的问题集中回复和讲解--------------------------------------
补充:回答评论中的疑问
问题: 有评论提出:数组类型如果是整型数组,转为List时,会报错?
答案: 在
JDK1.8
环境中测试,这三种转换方式是没有问题的。放心使用。对于Integer[]
整型数组转List的方法和测试结果如下:- 方式一:不支持增删
Integer[] intArray1 = new Integer[2]; List<Integer> list1 = Arrays.asList(intArray1); System.out.println(list1);
运行结果:
[null, null]
- 方式二:支持增删
Integer[] intArray2 = new Integer[2]; List<Integer> list2 = new ArrayList<Integer>(Arrays.asList(intArray2)) ; list2.add(2); System.out.println(list2);
运行结果:
[null, null, 2]
- 方式三:支持增删,且数据量大最高效
Integer[] intArray3 = new Integer[2]; List<Integer> list3 = new ArrayList<Integer>(intArray3.length); Collections.addAll(list3, intArray3); list3.add(3); System.out.println(list3);
运行结果:
[null, null, 3]
综上,整型
Integer[]
数组转List<Integer>
的正确方式应该是这样的。猜想你们遇到的问题: 由于评论没有给出报错的代码,所以我猜想你们出现的错误可能是这样转换的:
int[] intArray1 = new int[2]; List<Integer> list1 = Arrays.asList(intArray1);//此处报错!!!
报错原因:等号两边类型不一致,当然编译不通过。分析见下文。
那么在声明数组时,用
int[]
还是Integer[]
,哪种声明方式才能正确的转为List
呢?
答案: 只能用Integer[]
转List<Integer>
,即只能用基本数据类型的包装类型,才能直接转为List
。原因分析如下:
我们来看
List
在Java源码中的定义(别害怕看不懂源码,看我分析,很易懂的):public interface List<E> extends Collection<E> {省略…}
再来看
Arrays.asList()
的在Java源码定义:public static <T> List<T> asList(T... a) { return new ArrayList<>(a); }
-
从上述源码中可以看出,
List
声明时,需要传递一个泛型<E>
作为形参,asList()
参数类型也是泛型中的通配类型<T>
。Java中所有的泛型必须是引用类型。 -
什么是引用类型?
Integer
是引用类型,那int
是什么类型?int
是基本数据类型,不是引用类型。这就是为什么java中没有List<int>
,而只有List<Integer>
。 -
举一反三:其他8种基本数据类型
byte、short、int、long、float、double、char
也都不是引用类型,所以8种基本数据类型都不能作为List的形参。但String、数组、class、interface
是引用类型,都可以作为List的形参,所以存在List<Runnable>
接口类型的集合、List<int[]>
数组类型的集合、List<String>
类的集合。但不存在list<byte>
、list<short>
等基本类型的集合。
有了上述基础知识后,再来看为什么下面两行代码第二行能编译通过,第三行却编译报错?
int[] intArray1 = new int[1]; Arrays.asList(intArray1);//编译不报错 List<Integer> list1 = Arrays.asList( intArray1);//编译报错
答案:
- 第二行代码,
Arrays.asList()
方法的入参是个引用类型的int[]
,那么返回值类型一定是List<int[]>
,其完整代码是:List<int[]> intsArray = Arrays.asList(intArray1);
,所以编译通过,没问题。 - 第三行报错,因为等号两边的类型不一致,左边:
List<Integer>
,右边List<int[]>
,所以编译时就报错。
总结
现在你应该明白,为什么
int[]
不能直接转换为List<Integer>
,而Integer[]
就可以转换为List<Integer>
了吧。因为List
中的泛型必须是引用类型,int
是基本数据类型,不是引用类型,但int
的包装类型Integer
是class
类型,属于引用类型,所以Integer
可以作为List
形参,List<Integer>
在java中是可以存在的,但不存在List<int>
类型。在编码时,我们不光要知其然,还要知其所以然,通过分析JDK源码,才能得出一手信息,不仅了解到了如何用,还能得出为何这样用。
希望我的解答对你有帮助,有疑惑的地方,可以在文章下方评论,我会给大家解惑的,喜欢本文请点赞和收藏。
-
python 两个list 求交集,并集,差集
2016-06-09 17:59:52在python中,数组可以用list来表示。如果有两个数组,分别要求交集,并集与差集,怎么实现比较方便呢? 当然最容易想到的是对两个数组做循环,即写两个for循环来实现。这种写法大部分同学应该都会,而且也没有太多... -
Java编程:删除 List 元素的三种正确方法
2016-11-30 16:44:59删除 List 中的元素会产生两个问题: 删除元素后 List 的元素数量会发生变化; 对 List 进行删除操作可能会产生并发问题; 我们通过代码示例演示正确的删除逻辑package com.ips.list;import java.util.ArrayList;... -
java根据list中对象的属性找出list重复数据或去除list重复数据
2017-11-17 15:12:50在实际开发中,经常会遇到需要找出(删除)一个list中某些元素的属性相同的元素,或者两个list中某些元素的属性相等的元素,这种方法很多,这里整理列出一些: 废话不说,上代码,有注释掉的你们自己看import java.... -
fastjson List转JSONArray以及JSONArray转List
2018-05-31 11:25:541.fastjson List转JSONArrayList<T> list = new ArrayList<T>();JSONArray array= JSONArray.parseArray(JSON.toJSONString(list));2.fastjson JSONArray转ListJSONArray array = ... -
Pandas把dataframe或series转换成list
2019-08-12 12:25:15把dataframe转换为list 输入多维dataframe: df = pd.DataFrame({'a':[1,3,5,7,4,5,6,4,7,8,9], 'b':[3,5,6,2,4,6,7,8,7,8,9]}) 把a列的元素转换成list: # 方法1 df['a'].values.tolist() # 方法2 df['a'].... -
list的五种去重方法
2018-10-31 10:12:35面试中经常被问到的list如何去重,一般是口述,不需要代码体现,这个时候,思维一定要清晰,可以罗列出集中去重的方法,以展现你对list数据结构,以及相关方法的掌握,体现你的java基础学的是否牢固 下面,我就将五种方法逐一... -
Java8新特性Stream之list转map及问题解决
2018-10-11 14:57:44List集合转Map,用到的是Stream中Collectors的toMap方法:Collectors.toMap 具体用法实例如下: //声明一个List集合 List&lt;Person&gt; list = new ArrayList(); list.add(new Person(&... -
vsftpd中关于ftpusers和user_list两个文件的说明以及vsftpd.conf中的userlist_enable和userlist_deny两个...
2014-12-31 09:09:30问题一:ftpusers和user_list两个文件各自的用途是什么?有何关系?首先请明确一点:ftpusers不受任何配制项的影响,它总是有效,它是一个黑名单!该文件存放的是一个禁止访问FTP的用户列表,通常为了安全考虑,管理... -
List转Map的三种方法
2018-04-03 13:26:33List转Map三种方法。 -
Mybatis 传递参数类型为List的取值问题
2020-03-22 19:54:13Mybatis 传递参数类型为List的取值问题 问题描述: 参数传递为List时: 当传递一个 List 实例或者数组作为参数对象传给 Mybatis。此时,Mybatis 会自动将它包装在一个 Map 中,用名称在作为键。List 实例将会以“list... -
unable to access android sdk add-on list
2016-01-22 17:01:15你也可以查看我的其他同类文章,也会让你有一定的收货!造成这个问题的原因可能有多种,下面两种方法,我亲自测试后可用,如果都不行,请在评论里告诉我,我会尽快帮你分析解决。左侧的文章分类中,Android Studio... -
List转JSONArray和JSONArray转List
2019-08-19 20:59:331.List转JSONArray List<T> list = new ArrayList<T>(); JSONArray array= JSONArray.parseArray(JSON.toJSONString(list)); 2.JSONArray转List JSONArray array = new JSONArray(); List<... -
【Java面试题】List如何一边遍历,一边删除?
2020-03-20 12:10:36List如何一边遍历,一边删除? -
list indices must be integers or slices, not tuple
2017-08-29 12:13:34以下两种情况都会出现此错误: points = [ [1, 2], ...list的维数必须一致:正确写法: points = [ [1, 2], [0, 4], [2, 0] ] 这个也会报错: stations = ['Schagen', 'Heerhugow... -
list stream:计算对象List中某个字段的总和
2019-03-17 02:29:21计算一个number类型的List对象总和 Integer[] integerArray = {1, 3, 5, 10, 18}; List<Integer> list = new ArrayList<>(Arrays.asList(integerArray)); IntSummaryStatistics ... -
Java中List的详细用法
2018-09-11 16:36:43list中添加,获取,删除元素; list中是否包含某个元素; list中根据索引将元素数值改变(替换); list中查看(判断)元素的索引; 根据元素索引位置进行的判断; 利用list中索引位置重新生成一个新的list(截取... -
java怎么获取list长度
2018-06-19 20:08:38java 怎么获取list长度java中的length属性是针对数组说的,比如说你声明了一个数组,想知道这个数组的长度则用到了length这个属性java中的length()方法是针对字符串String说的,如果想看这个字符串的长度则用到length()... -
python中list与string的转换
2019-05-15 13:00:141.list转string 命令:''.join(list) 其中,引号中是字符之间的分割符,如“,”,“;”,“\t”等等 如: list = [1, 2, 3, 4, 5] ''.join(list) 结果即为:12345 ','.join(list) 结果即为:1,2,3,4,5 str=... -
vsftpd 配置:chroot_local_user与chroot_list_enable详解
2015-01-05 09:24:38很多情况下,我们希望限制ftp用户只能在其主目录下(root dir)下活动,不允许他们跳出主目录之外浏览服务器上的其他目录,这时候我就需要使用到chroot_local_user,chroot_list_enable,chroot_list_file这三个选项了... -
Python中如何求列表list的平均数
2019-09-28 10:12:07Python中如何求列表list的平均数 当列表list中只包含数字时,如何求取它的平均数: from numpy import * a = [52,69,35,65,89,15,34] b = mean(a) print(b) 运行结果: 51.285714285714285 ... -
List排序
2019-10-13 19:51:21List<bean>排序 前言: 对List中的所有bean进行排序 ,排序主要是利用JDK自带的 Collections.sort; 代码如下: 这是一个运用Demo: public class MyCompareSort { public static void peopleSort... -
将Object转换成List
2019-08-27 20:01:29java中如果需要将一个object转成list,大部分人会直接使用强制类型转换:(List<String>) obj这样。这样强制转换编译会提示Unchecked cast: 'java.lang.Object' to 'java.util.List<java.lang.String>',... -
List转换成String字符串三种方式
2019-08-15 11:58:34List转换成String字符串思路分析: 1.List转化成String[],再通过String[]数组遍历拼接成String字符串; 2.List转化成String存到StringBuffer中,再通过StringButter中的append()方法拼接成String字符串; 注意:... -
Python判断两个list相等
2018-06-04 10:45:14Python2可以使用cmp()函数,但是在Python3中我们可以使用下面的方法来比较两个list是否相等学习连接import operator a=[1,-1,0] b=[1,-1,0] c=[-1,1,0] print(operator.eq(a,b)) print(operator.eq(a,c))实验结果:... -
List集合中的对象根据属性排序
2014-11-27 11:11:02集合类List存放的数据,默认是按照放入时的顺序存放的,比如依次放入A、B、C,则取得时候,则也是A、B、C的顺序,实际场景中,有时我们需要根据自定义的规则对List中的元素进行排序,该如何实现呢?看下面小例子: ... -
python 从list中随机取值
2018-12-11 17:17:49list1 = ['佛山', '南宁', '北海', '杭州', '南昌', '厦门', '温州'] a = random.choice(list1) print(a) # 返回一个值 第二种方法 适用于随机取一组值, 返回一个list import random list1 = ['佛山', '南宁', .....
-
跟我练内测小分队学习礼包
-
RabbitMQ消息中间件实战(附讲义和源码)
-
Qt操作XML文档(增删改查)
-
屏幕录像机(oCam)500.0单文件特别版.exe.zip
-
记录我定位了2天的bug,记录下自己的活动
-
同步电路设计中CLOCK+SKEW的分析
-
【数据分析-随到随学】Mysql数据库
-
(新)备战2021软考网络工程师培训学习套餐
-
Spring MVC - 数据校验(验证器)
-
前端架构师-速成
-
tornado入门必看2
-
FFmpeg4.3黄金系列课程:c++版
-
「Verilog HDL」自学计划|数据流建模
-
Java多线程学习补充
-
vue 音乐进度条拖拽
-
C++大规模代码开发教程.zip
-
MD5生成器.zip
-
pytorch 计算图
-
【数据分析-随到随学】Hive详解
-
Django——图书管理系统(五)