日期:2014-05-20  浏览次数:20849 次

求助 将List 进行分组
如下所示:这是一个List,其中每一行是一个object. 我想对这个List进行分组,第一关键字是A列 。第二关键字B列。 
 A B C 

ANN1 off1 null 

ANN2 off2 V1 

ANN2 off2 V2 

ANN3 off2 V1 

ANN3 off2 V2 

ANN3 off3 V3 

进行分组后显示的效果如下: 

ANN1# 
 off1
 
ANN2# 
 off2 
  V1 
  V2 

ANN3# 
 off2 
  V1 
  V2 
  v3 


------解决方案--------------------
用List或/和Map的嵌套就可以解决。

比如一个Map的key是你的A列,Map的value是另一个Map;嵌套的这个Map的key是你的B列或者C列,value是空。如果你需要把B列、C列区别看来,那就做个Pair对象作为第一个Map的value,Pair里放两个Map,一个对应B列,一个对应C列。

以上只是一个思路,有很多方式可以解决。



------解决方案--------------------
学习一下 顶
------解决方案--------------------
[color=#99CCFF]
Java code
package sunflowerbbs.oicp.net;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;

public class GroupByKey {
    private static class Record implements Comparable<Record>, Cloneable {
        private String _A;

        private String _B;

        private String _C;

        public Record(String _a, String _b, String _c) {
            _A = _a;
            _B = _b;
            _C = _c;
        }

        private Record() {

        }

        public int compareTo(Record record) {
            int result = this._A.compareTo(record._A);
            if (result != 0) {
                return result;
            } else {
                return this._B.compareTo(record._B);
            }

        }

        public Object clone() {
            Record record = new Record();
            record._A = new String(this._A);
            record._B = new String(this._B);
            record._C = this._C != null ? new String(this._C) : null;
            return record;
        }
    }

    public static void main(String[] args) {
        Record r1, r2, r3, r4, r5, r6, r7;
        r1 = new Record("A2", "B3", "C3");
        r2 = new Record("A3", "B4", "C5");
        r3 = new Record("A2", "B3", "C2");
        r4 = new Record("A1", "B1", null);
        r5 = new Record("A2", "B3", "C4");
        r6 = new Record("A1", "B2", "C1");
        r7 = new Record("A3", "B4", "C7");
        ArrayList<Record> list = new ArrayList<Record>();
        list.add(r1);
        list.add(r2);
        list.add(r3);
        list.add(r4);
        list.add(r5);
        list.add(r6);
        list.add(r7);
        Collections.<Record> sort(list);
        Iterator it = list.iterator();
        StringBuffer buffA = new StringBuffer();
        StringBuffer buffB = new StringBuffer();
        StringBuffer buffC = new StringBuffer();
        Record prior = (Record) it.next();
        buffA.append(prior._A);
        buffB.append(prior._B);
        buffC.append(prior._C == null ? "" : " " + prior._C); //chang it by yourself
        while (it.hasNext()) {
            Record next = (Record) it.next();
            int result1 = prior._A.compareTo(next._A);
            int result2 = prior._B.compareTo(next._B);
            if (result1 != 0) {
                System.out.println(buffA.toString() + "\n " + buffB.toString()
                        + "\n " + buffC.toString() + "\n "); //chang it by yourself
                buffA = new StringBuffer(next._A);
                buffB = new StringBuffer(next._B);
                buffC = new StringBuffer(next._C);
            } else if (result2 != 0) {
                buffB.append("\n " + next._B);
                buffC.append("\n " + next._C);
            } else {
                buffC.append("\n " + next._C == null ? "" : next._C);
            }
            prior = (Record) next.clone();
            if (!it.hasNext()) {
                if (!buffA.toString().equals(prior._A)) {
                    System.out.println(prior._A + "\n " + prior._B + "\n "
                            + prior._C + "\n "); //chang it by yourself
                } else {
                    System.out.println(buffA.toString() + "\n "
                            + buffB.toString() + "\n " + buffC.toString()
                            + "\n "); //chang it by yourself
                }
            }
        }

    }

}