Java中如何对list集合中相同的元素分类

需求如图:

import java.util.Arrays;

import java.util.Iterator;

import java.util.List;

import java.util.TreeSet;

public class MyCount {

public static void main(String[] args) {

Integer[] arr={1,2,2,2,2,4,4,4,6,6,6,6,12,12,13,13,13,16,17,19,19,19,36,39};

List<Integer> numList=Arrays.asList(arr);

TreeSet<Integer> ts=new TreeSet<>(numList);

Iterator<Integer> it=ts.iterator();

for (int i=0;it.hasNext();) {

int index=++i,num=it.next(),count=0;

System.out.println("工序"+index+":"+num);

for(int j=0;j<numList.size();j++) {

if(numList.get(j)==num) {

System.out.println("\t次数:"+(++count)+":"+num);

}

}

}

}

}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-10-19
周末没带电脑回来没法写,我说一下我的思路:
1、利用map相同key只能存在一次的性质来进行统计。Map< Integer, Integer>map=new HashMap<>();
2、遍历list,如果map. container(当前元素)为false,说明第一次遇到这个元素,比如说是数字2,则map.put(2,1),表示map中2出现了一次;如果返回为true,则说明2已经不是第一次出现了,则map.put(2,map. get(2)+1),令数字2的次数加一。集合遍历完成后,map中的key就代表了不同的数字,value代表了这个数字出现的次数。
3、遍历map,完成你想要的输出格式。本回答被网友采纳
第2个回答  2020-01-01
public class ListSort {

/**
* 按照List<Map<String,Object>>里面map的某个value重新封装成多个不同的list, 原始数据类型List<Map
* <String,Object>>, 转换后数据类型Map<String,List<Map<String,Object>>>
*
* @param list
* @param oneMapKey
* @return
*/
private static Map<String, Object> change(List<Map<String, Object>> list, String oneMapKey) {
Map<String, Object> resultMap = new HashMap<String, Object>();
Set<Object> setTmp = new HashSet<Object>();
for (Map<String, Object> tmp : list) {
setTmp.add(tmp.get(oneMapKey));
}
Iterator<Object> it = setTmp.iterator();
while (it.hasNext()) {
String oneSetTmpStr = (String) it.next();
List<Map<String, Object>> oneSetTmpList = new ArrayList<Map<String, Object>>();
for (Map<String, Object> tmp : list) {
String oneMapValueStr = (String) tmp.get(oneMapKey);
if (oneMapValueStr.equals(oneSetTmpStr)) {
oneSetTmpList.add(tmp);
}
}
resultMap.put(oneSetTmpStr, oneSetTmpList);
}
return resultMap;
}

/**
* 按照List<Map<String,Object>>里面map的某个value重新封装成多个不同的list, 原始数据类型List<Map
* <String,Object>>, 转换后数据类型Map<String,List<Map<String,Object>>>
*
* @param list
* @param oneMapKey
* @return
*/
private static List<Map<String, Object>> change2(List<Map<String, Object>> inList, String oneMapKey,
List<Map<String, Object>> outList) {
// 1.将某个key的值存在set中
Set<Object> setTmp = new HashSet<Object>();
for (Map<String, Object> tmp : inList) {
setTmp.add(tmp.get(oneMapKey));
}
// 2.遍历set
Iterator<Object> it = setTmp.iterator();
while (it.hasNext()) {
String oneMapValueStr = "";
String oneSetTmpStr = (String) it.next();
Map<String, Object> oneSetTmpMap = new HashMap<String, Object>();
List<Map<String, Object>> oneSetTmpList = new ArrayList<Map<String, Object>>();

for (Map<String, Object> tmp : inList) {
oneMapValueStr = (String) tmp.get(oneMapKey);
if (oneSetTmpStr.equals(oneMapValueStr)) {
oneSetTmpMap.put("text", oneSetTmpStr);
oneSetTmpList.add(tmp);
}
}
oneSetTmpMap.put("array", oneSetTmpList);
outList.add(oneSetTmpMap);
}
return outList;
}

public static void main(String[] args) {
Map<String, Object> map1 = new HashMap<String, Object>();
Map<String, Object> map2 = new HashMap<String, Object>();
Map<String, Object> map3 = new HashMap<String, Object>();
Map<String, Object> map4 = new HashMap<String, Object>();

List<Map<String, Object>> inList = new ArrayList<Map<String, Object>>();
map1.put("id", "111");
map1.put("name", "tom");
map1.put("sex", "male");

map2.put("id", "222");
map2.put("name", "jack");
map2.put("sex", "male");

map3.put("id", "333");
map3.put("name", "lucy");
map3.put("sex", "female");

map4.put("id", "444");
map4.put("name", "lucy");
map4.put("sex", "female");

inList.add(map1);
inList.add(map2);
inList.add(map3);
inList.add(map4);
System.out.println("原始inList:" + inList);

Map<String, Object> resultMap = new HashMap<String, Object>();
// resultMap = change(list, "sex");
resultMap = change(inList, "name");
System.out.println("按照map中的某个值重新封装后的resultMap:" + resultMap);

List<Map<String, Object>> outList = new ArrayList<Map<String, Object>>();
System.out.println("retList==1==:" + outList);
outList = change2(inList, "name", outList);
System.out.println("retList==2==:" + outList);

}
}