Collections用法总结

本文介绍了Java中Collections包装类,它包含集合操作的静态多态方法且不能实例化。详细讲解了排序、随机排序、反转、二分查找、填充、替换、拷贝等操作,还说明了各操作的代码示例及注意事项,如数组转List的类型要求等。

Collections是一个包装类,其中包含有各种有关集合操作的静态多态方,比如可以作用在List和Set上,此类不能实例化。


排序

Integer[] array = new Integer[]{3, 10, 4, 0, 2};
List<Integer> integers = Arrays.asList(array);
Collections.sort(integers);
out.println(integers); //[0, 2, 3, 4, 10]

在这里借用了Arrays的asList方法,该方法可以将数组转成一个List。这里也只能对封装类型Integer数组调用asList方法,如果是int型的数组调用asList会出现其他问题。可以查考Arrays用法总结。


随机排序

out.println(integers); //[0, 2, 3, 4, 10]
Collections.shuffle(integers);
out.println(integers); //[0, 3, 10, 2, 4]

反转

out.println(integers); //[0, 3, 10, 2, 4]
Collections.reverse(integers);
out.println(integers); //[4,2,10,3,0]

 

Collections.binarySearch (Collection,Object  )解释:查找指定集合中得元素,返回所查找得元素索引
List<Integer> list = new ArrayList<> (  );
list.add ( 1 );
list.add ( 2 );
list.add ( 3 );
list.add ( 34 );
list.add ( 43 );
int ss = Collections.binarySearch ( list,2 );
System.out.println (ss);//1


填充(覆盖)元素

array = new Integer[]{3, 10, 4, 0, 2};
integers = Arrays.asList(array);
Collections.fill(integers, -1);
out.println(integers); //[-1, -1, -1, -1, -1]
out.println(Arrays.toString(array)); //[-1, -1, -1, -1, -1]

通过输出可以发现原数组的值也跟着发生了变化,因为是封装类型,所以Integer[]中和List<Integer>中的元素指向的是用一个Integer对象的地址,所以两个会一起变化。


替换元素
array = new Integer[]{3, 10, 4, 4, 4};
integers = Arrays.asList(array);
Collections.replaceAll(integers, 4, -4);//(含义:替换批定元素为某元素,若要替换得值存在在返回TRUE否则返回FALSE)
out.println(integers); //[3, 10, -4, -4, -4]

拷贝List

out.println(integers); //[3, 10, -4, -4, -4]
List<Integer> integersCopy = new ArrayList<>();  integersCopy.add(1);
integersCopy.add(1);
integersCopy.add(1);
integersCopy.add(1);
integersCopy.add(1);
integersCopy.add(1);
//如果不对List调用add方法,integerCopy还是空的,下面的copy方法会出错
Collections.copy(integersCopy, integers);
out.println(integersCopy); //[3, 10, -4, -4, -4, 1]


返回List中的最大值,最小值

array = new Integer[]{3, 10, 4, 0, 2};
integers = Arrays.asList(array);
out.println(integers);
out.println(Collections.min(integers)); //0
out.println(Collections.max(integers)); //10

源列表中第一次和最后一次出现指定列表的起始位置

Integer[] array1 = new Integer[]{3, 10, 4, 0, 2, 4, 0};
List integers1 = Arrays.asList(array1);
Integer[] array2 = new Integer[]{4, 0};
List integers2 = Arrays.asList(array2);
out.println(Collections.lastIndexOfSubList(integers1, integers2)); //5
out.println(Collections.indexOfSubList(integers1, integers2)); //2(含义:查找integers2首次出现在integers1位置索引从0开始)

 

fill(List list,Object o)解释:用对象 o 替换集合list中所有元素。

List list = Arrays.asList ( "1 2 323 4 5 6".split ( " " ) );
Collections.fill ( list,"我是被替换的" );
System.out.println (list);//[我是被替换的, 我是被替换的, 我是被替换的, 我是被替换的, 我是被替换的, 我是被替换的]


循环移动

out.println(integers); [3, 10, 4, 0, 2]
Collections.rotate(integers, 1); //[2, 3, 10, 4, 0] 依次右移一位
out.println(integers);
Collections.rotate(integers, -2); //[10, 4, 0, 2, 3] 依次左移两位
out.println(integers);

二分查找,返回所在的下标。没有找到返回负的下标值。

array = new Integer[]{0, 2, 4, 10, 20};
integers = Arrays.asList(array);
out.println(Collections.binarySearch(integers, 4)); //2
out.println(Collections.binarySearch(integers, 9)); //-4

指定元素在集合中出现的次数

array = new Integer[]{0, 2, 4, 4, 20};
integers = Arrays.asList(array);
out.println(Collections.frequency(integers, 4)); //2

得到对象的n份拷贝

List<Integer> numbers = new ArrayList<>();
numbers.add(1);
List<List<Integer>> lists = Collections.nCopies(3, numbers);
out.println(lists); //[[1], [1], [1]]
numbers.add(2);
out.println(lists); //[[1, 2], [1, 2], [1, 2]]

Collections.nCopies(n, object)返回一个List对象,该List对象中含有对象object的n份拷贝,然而实际上列表中并没有存储n份拷贝,从中任意取出一个时,得到的是同一个object。

转载于:https://www.cnblogs.com/ysySelf/p/11044652.html

<think>好的,我现在需要解决用户的问题:如何使用Python的collections.Counter对字典进行计数操作。用户希望得到示例教程。首先,我应该回顾一下自己对Counter的了解。 根据提供的引用资料,Counter主要用于统计可迭代对象中的元素出现次数,例如列表或字符串。它返回的是一个类似字典的对象,键是元素,是计数。用户的问题是关于如何处理字典,所以需要明确:用户是想用Counter来统计字典中的键对,还是用字典作为输入给Counter? 接下来,我需要考虑可能的场景。例如,用户可能有一个字典,里面的是某种可计数的事物,或者键是需要被计数的元素。或者,用户可能想将两个字典的计数合并。这时候,我需要想到Counter的一些方法,比如update()或者加法运算。 根据引用[3],Counter可以接受可迭代对象,比如列表,而字典本身也是可迭代的,迭代的是键。所以如果直接将字典传递给Counter,它会统计键的出现次数,这可能是用户想要的。例如,如果有一个字典d = {'a': 3, 'b': 2},使用Counter(d)会得到Counter({'a': 1, 'b': 1}),这可能符合预期。 那如果用户想要统计字典中的呢?或者统计键的出现次数?需要明确用户的需求。可能的示例包括:统计字典中的出现次数,或者将多个字典中的键合并统计。 比如,用户可能有多个字典,想要统计所有键出现的次数。这时候,可以将这些字典的键转换为列表,然后用Counter统计。例如,dict1 = {'a':1}, dict2 = {'a':2},合并后的键列表是['a', 'a'],Counter会统计'a'出现2次。 或者,用户想统计字典的的出现次数。比如,字典的是某些数据,需要统计每个出现的次数。这时需要将提取出来,转换成列表,再传给Counter。 此外,Counter本身支持加减操作,也可以和字典进行交互。例如,使用update方法将另一个字典的键对添加到Counter中,但需要注意,字典的键会被视为元素,而可能会被处理,除非使用特定的方法。 可能还需要考虑如何将两个字典的计数合并,这时候可以使用Counter的加法。例如,c1 = Counter({'a':1, 'b':2}),c2 = Counter({'a':3, 'c':1}),c1 + c2会得到Counter({'a':4, 'b':2, 'c':1}). 接下来,我需要构建示例。例如,如何用Counter处理字典的键或,如何合并多个字典的计数,或者如何将现有的字典转换为Counter对象进行计数操作。 可能的步骤: 1. 将字典的键转换为列表,用Counter统计键的出现次数(如果多个字典的话)。 2. 将字典的转换为列表,统计的出现次数。 3. 合并多个字典的计数,例如使用Counter.update()方法。 4. 将两个Counter对象相加。 还需要注意,当直接使用字典初始化Counter时,会被视为计数吗?例如,如果有一个字典d = {'a': 5, 'b': 3},那么Counter(d)会得到Counter({'a':5, 'b':3})。这时候,如果用户是想统计某个列表中元素的次数,但初始数据是字典形式,可能需要这样的处理。 所以,可能的示例包括: 示例1:统计字典中键的出现次数(如果有多个字典的情况下)。 示例2:统计字典的出现次数。 示例3:将多个字典的键合并统计。 示例4:使用Counter的方法来操作字典形式的计数。 此外,需要提醒用户注意,当使用字典作为Counter的输入时,字典的键会被视为元素,会被视为该元素的计数。这可能与直接传递列表同,列表中的每个元素会计数一次,而字典的会成为计数器的初始。 比如,dict1 = {'apple': 3, 'banana': 2},Counter(dict1)的结果是Counter({'apple':3, 'banana':2}),这相当于直接指定每个元素的计数。而如果用户有一个列表['apple', 'apple', 'apple', 'banana', 'banana'],用Counter统计会得到相同的结果。 因此,如果用户希望将字典中的作为元素的计数来使用,可以直接将字典传递给Counter。例如,统计物品的数量,字典中的键是物品名称,是数量,那么Counter可以方便地处理这种情况。 接下来,我需要整理这些思路,形成结构清晰的步骤,并给出代码示例。同时,根据用户提供的引用资料,特别是引用[3]中的示例,可能需要展示如何处理字典到Counter的转换,以及如何操作Counter对象。 另外,用户的问题提到“处理字典”,可能包括将字典转换为计数器,或者对字典中的某些部分进行计数。因此,需要覆盖这些同的情况。 最后,需要确保代码正确,符合Python语法,并按照用户的要求使用正确的格式。</think>在Python中使用`collections.Counter`处理字典时,通常用于统计键的频次或将字典作为初始计数。以下是具体场景的示例教程: --- ### 一、统计字典键的频次 若需要统计多个字典中键的出现次数,可先将所有键提取为列表,再用`Counter`统计: ```python from collections import Counter dict1 = {'a': 1, 'b': 2} dict2 = {'a': 3, 'c': 4} dict3 = {'b': 5, 'd': 6} # 提取所有字典的键并合并为列表 all_keys = list(dict1.keys()) + list(dict2.keys()) + list(dict3.keys()) # 统计键的频次 key_counter = Counter(all_keys) print(key_counter) # 输出: Counter({'a': 2, 'b': 2, 'c': 1, 'd': 1}) ``` --- ### 二、将字典作为初始计数 直接传入字典给`Counter`时,键会被视为元素,作为初始计数: ```python from collections import Counter fruit_counts = {'apple': 5, 'banana': 3, 'orange': 2} counter = Counter(fruit_counts) print(counter) # 输出: Counter({'apple': 5, 'banana': 3, 'orange': 2}) # 更新计数(叠加字典中的) counter.update({'apple': 2, 'grape': 4}) print(counter) # 输出: Counter({'apple': 7, 'banana': 3, 'orange': 2, 'grape': 4}) ``` --- ### 三、统计字典的频次 若需统计字典的出现次数,可将所有转换为列表后统计: ```python from collections import Counter data = { 'user1': 'admin', 'user2': 'user', 'user3': 'admin', 'user4': 'guest' } # 提取所有并统计 role_counter = Counter(data.values()) print(role_counter) # 输出: Counter({'admin': 2, 'user': 1, 'guest': 1}) ``` --- ### 四、合并多个字典的计数 使用`Counter`的加法运算或`update()`方法合并计数: ```python from collections import Counter sales_day1 = {'apple': 3, 'banana': 2} sales_day2 = {'apple': 5, 'orange': 4} # 方法1:加法运算 total_sales = Counter(sales_day1) + Counter(sales_day2) print(total_sales) # 输出: Counter({'apple': 8, 'banana': 2, 'orange': 4}) # 方法2:update()方法 counter = Counter(sales_day1) counter.update(sales_day2) print(counter) # 输出: Counter({'apple': 8, 'banana': 2, 'orange': 4}) ``` --- ### 五、操作字典形式的Counter `Counter`支持字典的所有操作,例如获取键对或与普通字典交互: ```python from collections import Counter inventory = Counter({'apple': 10, 'banana': 7, 'orange': 3}) # 访问特定键的计数 print(inventory['apple']) # 输出: 10 # 添加新元素(等价于字典赋) inventory['grape'] = 5 # 转换为普通字典 normal_dict = dict(inventory) print(normal_dict) # 输出: {'apple': 10, 'banana': 7, 'orange': 3, 'grape': 5} ``` --- ### 关键点总结 1. **直接传入字典**时,键作为元素,作为初始计数[^3]。 2. **统计键或的频次**需先提取为列表。 3. **合并计数**推荐使用`Counter`的加法或`update()`方法[^2]。 4. `Counter`与普通字典兼容,可无缝转换[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值