一个List里面包含若干个对象,对象有两个属性分别是type和name请问怎样获得type,name分类的个数,例如得到如下结果:
type name 个数
a     x    5
a     y    3
b     x    8
c     z    4
谢谢!

解决方案 »

  1.   

    先实现比较器接口实现先按type排序然后按照那么排序,然后调用Collections的排序方法对该list进行排序,然后循环计数判断就可以实现楼主的目的了。
      

  2.   

    像上面的列子,是要求这样的结果name=a type=x的对象个数为5
    name=a type=y的对象个数为3
      

  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);
    }
    } }
    }
      

  4.   

    看看我写的代码,应该实现了你的要求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,个数为:2
    type=d,name=i,个数为:2
    type=d,name=x,个数为:1
    type=e,name=x,个数为:2
    type=h,name=p,个数为:1
      

  5.   

    [Quote=引用 6 楼 quanjinzhang 的回复:]
    感谢quanjinzhang,刚好解决了。还有个问题,如果增加了一项,sort,现在对象有三个属性type,name,sort,那判断要增加很多哦