java 如何把一个list里的相同数的出现次数输出成另一个list
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 如何把一个list里的相同数的出现次数输出成另一个list相关的知识,希望对你有一定的参考价值。
比如list的值是{1,2,2,5,4,4,3,2}
1出现1次,2出现3次,5出现1次,4出现2次,3出现1次
输出到一个新的list里{1,3,1,2,1}
java将list相同次数输出到另外一个list,可以使用map作为中间转换的结合,将重复的次数赋值给value,而key值为list原来的内容,实例如下:
import java.util.ArrayList;import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Test
public static void main(String[] args)
List<Integer> list = new ArrayList<Integer>();//新建一个集合
list.add(1);
list.add(2);
list.add(2);
list.add(5);
list.add(4);
list.add(4);
list.add(3);
list.add(2);
Map<Integer, Integer> map = new HashMap<Integer, Integer>();//新建一个map集合,用来保存重复的次数
for(Integer obj: list)
if(map.containsKey(obj))//判断是否已经有该数值,如有,则将次数加1
map.put(obj, map.get(obj).intValue() + 1);
else
map.put(obj, 1);
ArrayList<Integer> newList = new ArrayList<Integer>(map.values());//新建另外一个list
System.out.println(newList.toString());
参考技术A 利用 indexOf功能,检索到不同index的,就同时删除两个、添加到另一个List中。
——如果考虑出现更多次数的,就直到indexOf=-1,再删除自己。 参考技术B 旧list:list1 新list:list2
取list1的第一个值,放进list2中,循环list1,比较是否和list1的第一个值相同,如果相同删除.然后取list1的第一个值,放进list2中,循环list1,比较是否和list1的第一个值相同,如果相同删除,以此就可以了,代码自己实现吧,都给你写出来就没意思了 参考技术C 你这个是数组吧
{1,2,2,5,4,4,3,2}
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Test
public static void main(String[] args)
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(2);
list.add(5);
list.add(4);
list.add(4);
list.add(3);
list.add(2);
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for(Integer obj: list)
if(map.containsKey(obj))
map.put(obj, map.get(obj).intValue() + 1);
else
map.put(obj, 1);
ArrayList<Integer> newList = new ArrayList<Integer>(map.values());
System.out.println(newList.toString());
--------测试
[1, 2, 1, 3, 1]本回答被提问者采纳
java for循环 怎样把一个list里相同的数据放到一起
例如 1,1,2,3,4,2,1
输出 1,1,1 2,2 3 4
通过题主的描述可以看到,其实就是一个List<Integer>的集合数据处理问题,希望把相同的数据放到一起,是一种归类操作,也就是说其实总得需要把List<Integer>形式转化为Map<Integer, List<Integer>>的形式
这种形式map的key也就是当前的这个数字,而这个value就是这个数字对应的所有当前出现此key的集合
List<Integer> list = Arrays.asList(1, 1, 2, 3, 4, 2, 1);Map<Integer, List<Integer>> map = new HashMap<>();
for (Integer num : list)
// map是否包含此key,若已经包含则添加一个新的数字到对应value集合中
if (map.containsKey(num))
map.get(num).add(num);
else
// map不包含此key,则重新创建一个新集合,并把这个数字添加进集合
// ,再把集合放到map中
List<Integer> newList = new ArrayList<>();
newList.add(num);
map.put(num, newList);
System.out.println(map);
输出结果
这只是简单把map打印出来,当然有了这个map,想怎么样输出都是可以的了
额外的,上面的那种写法虽然也还算简单明了,但是对于如今Java8中的流(Stream)操作而言,还是显得太复杂了,而且采用for这种外部循环告诉机器你要怎样循环怎么取值,怎样操作实在繁琐,太过命令式编程,若采用Stream的方式来写上述过程就非常简答了,只需要告诉机器你要做什么就可以了,不用去管怎么循环,只管要什么操作(把JDK升到8即可尝试以下代码)
// 第二种方式Java8 StreamMap<Integer, List<Integer>> map1 = list.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.toList()));
System.out.println(map1);
一行代码就搞定了,这里采用的是Collectors.groupingBy方法进行归类数据,里面两个参数代表分别代表:
如何把流中的数据进行归类,表示归类的依据,由于是数字本身,所以第一个参数传入Function.identity,就是代表本身的意思,数字相同就归类到一起
第二个参数是代表,把归类到一起的数字怎么合到一起,Collectors.toList代表就是把数字归类成集合,所以返回的就是Map<Integer, List<Integer>>,这正好是我们要的结果
由于Collectors.groupingBy默认是按照Collectors.toList的方式进行归类的,所以上面的代码还可以再减少一个参数,写为
// 第二种方式Java8 StreamMap<Integer, List<Integer>> map1 = list.stream().collect(Collectors.groupingBy(Function.identity()));
System.out.println(map1);
结果为
结果也是一样的,题主可以自行选择
参考技术A对这个list里面的数据排序一下就行了啊
import java.util.ArrayList;import java.util.List;
//import java.util.Scanner;
public class Test
public static void main(String[] args)
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(12);
list.add(15);
list.add(1);
list.add(15);
list.add(12);
list.add(1);
list.add(12);
System.out.println("输入未排序的集合:");
for(int i = 0; i < list.size(); i++)
System.out.print(list.get(i) + " ");
// 冒泡排序
for (int k = 0; k < list.size() - 1; k++)
for (int j = k + 1; j < list.size(); j++) // 升序把<改成>
if (list.get(k) > list.get(j))
int temp = list.get(k);
list.set(k, list.get(j));
list.set(j, temp);
System.out.println("\\n输入排序后的集合:");
for(int i = 0; i < list.size(); i++)
System.out.print(list.get(i) + " ");
本回答被提问者采纳 参考技术B
java for循环查找list中的相同数据的方法:
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class FindDuplicate
public static void main(String[] args)
// 初始化list
List<String> list = new ArrayList<String>();
list.add("Jhon");
list.add("Jency");
list.add("Mike");
list.add("Dmitri");
list.add("Mike");
// 利用set不允许元素重复的性质去掉相同的元素
Set<String> checkDuplicates = new HashSet<String>();
for (int i = 0; i < list.size(); i++)
String items = list.get(i);
if (!checkDuplicates.add(items))
// 打印重复的元素
System.out.println("Duplicate in that list " + items);
参考技术C
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class YuGiOh
public static void main ( String[] args )
List<Integer> stooges = Arrays.asList (1, 1, 2, 3, 4, 2, 1);
System.out.println (stooges);
Collections.sort (stooges);
System.out.println (stooges);
参考技术D import java.util.*;
import java.util.stream.*;
/**使用 jdk8 stream
* @author hardneedl
*/
final class GroupingDemo
public static void main(String... args)
//准备原始数据内容
Stream<Integer> numstream = Stream.of(1,1,2,3,4,2,1);
//分组
Map<Integer, List<Integer>> groups = numstream.collect(
Collectors.groupingBy(
t -> t
)
);
//这里暂时先打印分组后的结果
System.out.println(groups);
以上是关于java 如何把一个list里的相同数的出现次数输出成另一个list的主要内容,如果未能解决你的问题,请参考以下文章