一组对象,根据对象的两个属性分类的问题 一个List里面包含若干个对象,对象有两个属性分别是type和name请问怎样获得type,name分类的个数,例如得到如下结果:type name 个数a x 5a y 3b x 8c z 4谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 先实现比较器接口实现先按type排序然后按照那么排序,然后调用Collections的排序方法对该list进行排序,然后循环计数判断就可以实现楼主的目的了。 像上面的列子,是要求这样的结果name=a type=x的对象个数为5name=a type=y的对象个数为3 我用下面的代码实现了,不过感觉太繁琐了,应该有很简洁的方法来处理吧,请赐教,谢谢。Evc是list的对象的类package src.two;import java.util.ArrayList;import java.util.HashMap;import java.util.HashSet;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Set;public class Test { public static void main(String args[]){ Evc e1 = new Evc(); Evc e2 = new Evc(); Evc e3 = new Evc(); Evc e4 = new Evc(); Evc e5 = new Evc(); Evc e6 = new Evc(); e1.setName("a"); e1.setType("node"); e2.setName("b"); e2.setType("port"); e3.setName("c"); e3.setType("port"); e4.setName("d"); e4.setType("link"); e5.setName("c"); e5.setType("port"); e6.setName("d"); e6.setType("link"); List<Evc> listEvc = new ArrayList<Evc>(); listEvc.add(e1); listEvc.add(e2); listEvc.add(e3); listEvc.add(e4); listEvc.add(e5); listEvc.add(e6); Map<String, List<Evc>> map = new HashMap<String, List<Evc>>(); for(Evc e:listEvc){ if(!map.containsKey(e.getName())){ List<Evc> list = new ArrayList<Evc>(); list.add(e); map.put(e.getName(), list); }else{ List<Evc> list = map.get(e.getName()); list.add(e); map.put(e.getName(), list); } } int temp = 0; System.out.println(map.size()); Set<String> keys = map.keySet(); Iterator<String> it = keys.iterator(); while(it.hasNext()){ String key = it.next(); List<Evc> list = map.get(key); Map<String, Integer> map2 = new HashMap<String, Integer>(); for(Evc e:list){ if(!map2.containsKey(e.getType())){ map2.put(e.getType(), 1); }else{ temp = map2.get(e.getType()); temp++; map2.put(e.getType(), temp); } } Set<String> keys2 = map2.keySet(); Iterator<String> it2 = keys2.iterator(); while(it2.hasNext()){ String key2 = it2.next(); int value2 = map2.get(key2); System.out.println("name="+key+" type="+key2+" number="+value2); } } }} 看看我写的代码,应该实现了你的要求import java.util.Collections;import java.util.Comparator;import java.util.List;import java.util.Vector;public class Test20090409 { String type = null; String name = null; public Test20090409(String tType,String tName){ type = tType; name = tName; } public static void main(String[] args){ List list = new Vector(); Test20090409 t1 = new Test20090409("a","x");//2 Test20090409 t2 = new Test20090409("d","i");//2 Test20090409 t3 = new Test20090409("e","x");//2 Test20090409 t4 = new Test20090409("a","x"); Test20090409 t5 = new Test20090409("d","x");//1 Test20090409 t6 = new Test20090409("h","p");//1 Test20090409 t7 = new Test20090409("e","x"); Test20090409 t8 = new Test20090409("d","i"); Test20090409 t9 = new Test20090409("j","i");//1 list.add(t1); list.add(t2); list.add(t3); list.add(t4); list.add(t5); list.add(t6); list.add(t7); list.add(t8); list.add(t9); Collections.sort(list, new MyComparetor()); int count = 1; String tType=null,tName = null; for(int i=0;i<list.size();i++){ Test20090409 Ti = (Test20090409)list.get(i); if(i==0){ tType = Ti.type; tName = Ti.name; continue; } Test20090409 Ti_1 = (Test20090409)list.get(i-1); String nowType = Ti.type; String nowName = Ti.name; if((tType==null && nowType ==null) ||(tType!=null && tType.equals(nowType))){ if((tName == null && nowName == null) ||(tName!=null && tName.equals(nowName))){ count++; continue; } } System.out.println("type="+tType+",name="+tName+",个数为:"+count); count = 1; tType = nowType; tName = nowName; } }}//实现先按照type排序再按照name排序的排序接口class MyComparetor implements Comparator { public int compare(Object o1, Object o2) { String o1ClassName = o1.getClass().getName(); String o2ClassName = o2.getClass().getName(); if(!o1ClassName.endsWith("Test20090409") ||!o2ClassName.endsWith("Test20090409")){ System.out.println("只能比较类型为Test20090409的对象!"); return 0; } Test20090409 t1 = (Test20090409)o1; Test20090409 t2 = (Test20090409)o2; if(t1.type == null){ if(t2.type == null){ if(t1.name==null){ if(t2.name==null){ return 0; }else{ return -1; } }else{ if(t2.name==null){ return 1; }else{ return t1.name.compareTo(t2.name); } } }else{ return -1; } }else{ if(t2.type == null){ return 1; }else{ if(t1.type.compareTo(t2.type)==0){ if(t1.name ==null){ if(t2.name ==null){ return 0; }else{ return -1; } }else{ if(t2.name ==null){ return 1; }else{ return t1.name.compareTo(t2.name); } } }else{ return t1.type.compareTo(t2.type); } } } }}运行结果如下:type=a,name=x,个数为:2type=d,name=i,个数为:2type=d,name=x,个数为:1type=e,name=x,个数为:2type=h,name=p,个数为:1 [Quote=引用 6 楼 quanjinzhang 的回复:]感谢quanjinzhang,刚好解决了。还有个问题,如果增加了一项,sort,现在对象有三个属性type,name,sort,那判断要增加很多哦 求非全0且7位的正则表达式 这种方式算重载吗? 一个类含有多个jdbc操作的问题? 得到汉字的首字母问题(急,在线等待) 汉字为何不能直接输入到JTable? 如何存储日期数据 大家推荐几种java/jsp 开发得辅助工具及下载地址 請高手指點!!!!!!!!!!!!!!!!!!! 请问在WIN2000中安装JDK 应该怎样设置环境变量啊? 创建一个service层实例总是出下面错误,求解 谁能详细的给我讲解一下关于变量存储,最好再讲讲C#里面的变量存储.........还有值类型引用类型。 如何给swing表格某一格设置背景
name=a type=y的对象个数为3
Evc是list的对象的类package src.two;import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;public class Test { public static void main(String args[]){
Evc e1 = new Evc();
Evc e2 = new Evc();
Evc e3 = new Evc();
Evc e4 = new Evc();
Evc e5 = new Evc();
Evc e6 = new Evc();
e1.setName("a");
e1.setType("node");
e2.setName("b");
e2.setType("port");
e3.setName("c");
e3.setType("port");
e4.setName("d");
e4.setType("link");
e5.setName("c");
e5.setType("port");
e6.setName("d");
e6.setType("link");
List<Evc> listEvc = new ArrayList<Evc>();
listEvc.add(e1);
listEvc.add(e2);
listEvc.add(e3);
listEvc.add(e4);
listEvc.add(e5);
listEvc.add(e6);
Map<String, List<Evc>> map = new HashMap<String, List<Evc>>();
for(Evc e:listEvc){
if(!map.containsKey(e.getName())){
List<Evc> list = new ArrayList<Evc>();
list.add(e);
map.put(e.getName(), list);
}else{
List<Evc> list = map.get(e.getName());
list.add(e);
map.put(e.getName(), list);
}
}
int temp = 0;
System.out.println(map.size());
Set<String> keys = map.keySet();
Iterator<String> it = keys.iterator();
while(it.hasNext()){
String key = it.next();
List<Evc> list = map.get(key);
Map<String, Integer> map2 = new HashMap<String, Integer>();
for(Evc e:list){
if(!map2.containsKey(e.getType())){
map2.put(e.getType(), 1);
}else{
temp = map2.get(e.getType());
temp++;
map2.put(e.getType(), temp);
}
}
Set<String> keys2 = map2.keySet();
Iterator<String> it2 = keys2.iterator();
while(it2.hasNext()){
String key2 = it2.next();
int value2 = map2.get(key2);
System.out.println("name="+key+" type="+key2+" number="+value2);
}
} }
}
import java.util.Comparator;
import java.util.List;
import java.util.Vector;
public class Test20090409 {
String type = null;
String name = null;
public Test20090409(String tType,String tName){
type = tType;
name = tName;
}
public static void main(String[] args){
List list = new Vector();
Test20090409 t1 = new Test20090409("a","x");//2
Test20090409 t2 = new Test20090409("d","i");//2
Test20090409 t3 = new Test20090409("e","x");//2
Test20090409 t4 = new Test20090409("a","x");
Test20090409 t5 = new Test20090409("d","x");//1
Test20090409 t6 = new Test20090409("h","p");//1
Test20090409 t7 = new Test20090409("e","x");
Test20090409 t8 = new Test20090409("d","i");
Test20090409 t9 = new Test20090409("j","i");//1
list.add(t1);
list.add(t2);
list.add(t3);
list.add(t4);
list.add(t5);
list.add(t6);
list.add(t7);
list.add(t8);
list.add(t9);
Collections.sort(list, new MyComparetor());
int count = 1;
String tType=null,tName = null;
for(int i=0;i<list.size();i++){
Test20090409 Ti = (Test20090409)list.get(i);
if(i==0){
tType = Ti.type;
tName = Ti.name;
continue;
}
Test20090409 Ti_1 = (Test20090409)list.get(i-1);
String nowType = Ti.type;
String nowName = Ti.name;
if((tType==null && nowType ==null)
||(tType!=null && tType.equals(nowType))){
if((tName == null && nowName == null)
||(tName!=null && tName.equals(nowName))){
count++;
continue;
}
}
System.out.println("type="+tType+",name="+tName+",个数为:"+count);
count = 1;
tType = nowType;
tName = nowName;
}
}
}
//实现先按照type排序再按照name排序的排序接口
class MyComparetor implements Comparator {
public int compare(Object o1, Object o2) {
String o1ClassName = o1.getClass().getName();
String o2ClassName = o2.getClass().getName();
if(!o1ClassName.endsWith("Test20090409")
||!o2ClassName.endsWith("Test20090409")){
System.out.println("只能比较类型为Test20090409的对象!");
return 0;
}
Test20090409 t1 = (Test20090409)o1;
Test20090409 t2 = (Test20090409)o2;
if(t1.type == null){
if(t2.type == null){
if(t1.name==null){
if(t2.name==null){
return 0;
}else{
return -1;
}
}else{
if(t2.name==null){
return 1;
}else{
return t1.name.compareTo(t2.name);
}
}
}else{
return -1;
}
}else{
if(t2.type == null){
return 1;
}else{
if(t1.type.compareTo(t2.type)==0){
if(t1.name ==null){
if(t2.name ==null){
return 0;
}else{
return -1;
}
}else{
if(t2.name ==null){
return 1;
}else{
return t1.name.compareTo(t2.name);
}
}
}else{
return t1.type.compareTo(t2.type);
}
}
}
}
}运行结果如下:
type=a,name=x,个数为:2
type=d,name=i,个数为:2
type=d,name=x,个数为:1
type=e,name=x,个数为:2
type=h,name=p,个数为:1
感谢quanjinzhang,刚好解决了。还有个问题,如果增加了一项,sort,现在对象有三个属性type,name,sort,那判断要增加很多哦