黑马程序员技术交流社区

标题: 关于排序 [打印本页]

作者: 赵庆礼    时间: 2012-6-28 12:09
标题: 关于排序
本帖最后由  赵庆礼 于 2012-6-28 14:30 编辑

{seqno=0, amt=1000, id=BOCC, date=20101010}
{seqno=1, amt=1000, id=RRRR, date=20101010}
{seqno=2, amt=1000, id=BOCC, date=20101009}
{seqno=3, amt=1000, id=BOCC, date=20101008}
{seqno=4, amt=1000, id=RRRR, date=20101013}
{seqno=5, amt=2000, id=RRRR, date=20101013}
.......
........

需求:
整体 为一个vector
每行为一个map

按id来分组,相同id中取日期最小的金额
求加和
有什么好的办法吗?

我的解法:
循环整个vector,distinct(id),
再循环id,内循环整个Vector,取出各个相同的id分组多个Vector,
再单独循环每一个vector取出各组中日期最小的...
很麻烦...

作者: 周朋飞    时间: 2012-6-28 12:15
我写一个 你试试吧
public class T001 {
public static void main(String[] args) {
Vector v = getV();
Map amtMap = getMixDateAmt(v);

double sum = 0;
Iterator iter = amtMap.keySet().iterator();
while(iter.hasNext()) {
sum += Double.parseDouble((String)amtMap.get(iter.next()));
}
}

private static Map getMixDateAmt(Vector v) {
Map dateMap = new HashMap();
Map amtMap = new HashMap();

String id1 = (String)((Map)v.get(0)).get("id");
String date1 = (String)((Map)v.get(0)).get("date");
String amt1 = (String)((Map)v.get(0)).get("amt");

dateMap.put(id1, date1);
amtMap.put(id1, amt1);

for(int i = 0; i < v.size(); i++) {
Map m = (Map)v.get(i);
String id2 = (String)m.get("id");
String date2 = (String)m.get("date");
String amt2 = (String)m.get("amt");

if(!dateMap.containsKey(id2)) {
dateMap.put(id2, date2);
amtMap.put(id2, amt2);
} else {
if(date2.compareTo((String)dateMap.get(id2)) < 0) {
dateMap.put(id2, date2);
amtMap.put(id2, amt2);
}
}
}
return amtMap;
}

public static ArrayList getDistinctId(Vector v) {
String id1 = (String)((Map)v.get(0)).get("id");
ArrayList list = new ArrayList();

list.add(id1);
for(int i = 0; i < v.size(); i++) {
Map m2 = (Map)v.get(i);
String id2 = (String)m2.get("id");
if(!id1.equals(id2) && !list.contains(id2)) {
list.add(id2);
}
}
System.out.println(list.toString());
return list;
}
}

作者: 黑马刘杰    时间: 2012-6-28 12:49
本帖最后由 Jackey 于 2012-6-28 12:50 编辑

好复杂!
作者: 周朋飞    时间: 2012-6-28 13:06
这是我调通了的程序 你要是哪点不理解 可以发给我 或者自己先debug一下

package testDemo;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Vector;

public class Test {
        public static void main(String[] args) {
                Vector v = getV();

                Map amtMap = getMixDateAmt(v);

                double sum = 0;
                Iterator iter = amtMap.keySet().iterator();
                while (iter.hasNext()) {
                        sum += Double.parseDouble((String) amtMap.get(iter.next()));
                        System.out.println(sum);
                }
                System.out.println(sum);
        }

        private static Vector getV() {
                // TODO Auto-generated method stub
                Vector vector = new Vector();
                Map<String, String> map1 = new HashMap<String, String>();
                Map<String, String> map2 = new HashMap<String, String>();
                Map<String, String> map3 = new HashMap<String, String>();
                Map<String, String> map4 = new HashMap<String, String>();
                Map<String, String> map5 = new HashMap<String, String>();
                map1.put("seqno", "0");
                map1.put("amt", "1000");
                map1.put("id", "1");
                map1.put("date", " 20101010");

                map2.put("seqno", "1");
                map2.put("amt", "1000");
                map2.put("id", "2");
                map2.put("date", " 20101010");

                map3.put("seqno", "2");
                map3.put("amt", "1000");
                map3.put("id", "1");
                map3.put("date", " 20101009");

                map4.put("seqno", "3");
                map4.put("amt", "1000");
                map4.put("id", "1");
                map4.put("date", " 20101008");

                map5.put("seqno", " 1");
                map5.put("amt", "1000");
                map5.put("id", "2");
                map5.put("date", " 20101013");
                vector.add(map1);
                vector.add(map2);
                vector.add(map3);
                vector.add(map4);
                vector.add(map5);

                return vector;
        }

        private static Map getMixDateAmt(Vector v) {
                Map dateMap = new HashMap();
                Map amtMap = new HashMap();

                String id1 = (String) ((Map) v.get(0)).get("id");
                String date1 = (String) ((Map) v.get(0)).get("date");
                String amt1 = (String) ((Map) v.get(0)).get("amt");

                dateMap.put(id1, date1);
                amtMap.put(id1, amt1);

                for (int i = 0; i < v.size(); i++) {
                        Map m = (Map) v.get(i);
                        String id2 = (String) m.get("id");
                        String date2 = (String) m.get("date");
                        String amt2 = (String) m.get("amt");
     
                        if (!dateMap.containsKey(id2)) {
                                dateMap.put(id2, date2);
                                amtMap.put(id2, amt2);
                        } else {
                                if (date2.compareTo((String) dateMap.get(id2)) < 0) {
                                        dateMap.put(id2, date2);
                                        amtMap.put(id2, amt2);
                                }
                        }
                }
                return amtMap;
        }

        public static ArrayList getDistinctId(Vector v) {
                String id1 = (String) ((Map) v.get(0)).get("id");
                ArrayList list = new ArrayList();

                list.add(id1);
                for (int i = 0; i < v.size(); i++) {
                        Map m2 = (Map) v.get(i);
                        String id2 = (String) m2.get("id");
                        if (!id1.equals(id2) && !list.contains(id2)) {
                                list.add(id2);
                        }
                }
                System.out.println(list.toString());
                return list;
        }
}

作者: 周朋飞    时间: 2012-6-28 13:07
这是我调通了的程序 你要是哪点不理解 可以发给我 或者自己先debug一下

package testDemo;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Vector;

public class Test {
        public static void main(String[] args) {
                Vector v = getV();

                Map amtMap = getMixDateAmt(v);

                double sum = 0;
                Iterator iter = amtMap.keySet().iterator();
                while (iter.hasNext()) {
                        sum += Double.parseDouble((String) amtMap.get(iter.next()));
                        System.out.println(sum);
                }
                System.out.println(sum);
        }

        private static Vector getV() {
                // TODO Auto-generated method stub
                Vector vector = new Vector();
                Map<String, String> map1 = new HashMap<String, String>();
                Map<String, String> map2 = new HashMap<String, String>();
                Map<String, String> map3 = new HashMap<String, String>();
                Map<String, String> map4 = new HashMap<String, String>();
                Map<String, String> map5 = new HashMap<String, String>();
                map1.put("seqno", "0");
                map1.put("amt", "1000");
                map1.put("id", "1");
                map1.put("date", " 20101010");

                map2.put("seqno", "1");
                map2.put("amt", "1000");
                map2.put("id", "2");
                map2.put("date", " 20101010");

                map3.put("seqno", "2");
                map3.put("amt", "1000");
                map3.put("id", "1");
                map3.put("date", " 20101009");

                map4.put("seqno", "3");
                map4.put("amt", "1000");
                map4.put("id", "1");
                map4.put("date", " 20101008");

                map5.put("seqno", " 1");
                map5.put("amt", "1000");
                map5.put("id", "2");
                map5.put("date", " 20101013");
                vector.add(map1);
                vector.add(map2);
                vector.add(map3);
                vector.add(map4);
                vector.add(map5);

                return vector;
        }

        private static Map getMixDateAmt(Vector v) {
                Map dateMap = new HashMap();
                Map amtMap = new HashMap();

                String id1 = (String) ((Map) v.get(0)).get("id");
                String date1 = (String) ((Map) v.get(0)).get("date");
                String amt1 = (String) ((Map) v.get(0)).get("amt");

                dateMap.put(id1, date1);
                amtMap.put(id1, amt1);

                for (int i = 0; i < v.size(); i++) {
                        Map m = (Map) v.get(i);
                        String id2 = (String) m.get("id");
                        String date2 = (String) m.get("date");
                        String amt2 = (String) m.get("amt");
     
                        if (!dateMap.containsKey(id2)) {
                                dateMap.put(id2, date2);
                                amtMap.put(id2, amt2);
                        } else {
                                if (date2.compareTo((String) dateMap.get(id2)) < 0) {
                                        dateMap.put(id2, date2);
                                        amtMap.put(id2, amt2);
                                }
                        }
                }
                return amtMap;
        }

        public static ArrayList getDistinctId(Vector v) {
                String id1 = (String) ((Map) v.get(0)).get("id");
                ArrayList list = new ArrayList();

                list.add(id1);
                for (int i = 0; i < v.size(); i++) {
                        Map m2 = (Map) v.get(i);
                        String id2 = (String) m2.get("id");
                        if (!id1.equals(id2) && !list.contains(id2)) {
                                list.add(id2);
                        }
                }
                System.out.println(list.toString());
                return list;
        }
}

作者: 李天甲    时间: 2012-6-28 13:29
晕了大哥们,提交问题的时候请把条件写的清楚一点呵呵,请尽量改一下名字,在网上搜不出来为妙
原帖请参见http://topic.csdn.net/u/20101214/13/eb1561c0-4f4d-403e-a4d5-56186735b9ae.html

这个题目解起来不难,
跟提问题的人的思路差不多

先循环整个vector,distinct(id),注意这里产生的是一个只有唯一ID的list

再循环id,(这个?呵呵,上面解题的同学你没用上上面的参数呵呵)
内循环整个Vector,取出各个相同的id分组多个Vector,

再单独循环每一个vector取出各组中日期最小的...

基本就是这样了
作者: 赵庆礼    时间: 2012-6-28 14:15
周朋飞 发表于 2012-6-28 12:15
我写一个 你试试吧
public class T001 {
public static void main(String[] args) {

周,我看明白了,谢谢
作者: 周朋飞    时间: 2012-6-28 21:31
既然写了 就多写点吧 ,其实对Map排序有两种方法,一种是题中所提用keySet方法,另一种方法更为高效 就是通过entrySet来做
double sum = 0;
                Set<Map.Entry<String, String>> entrys = amtMap.entrySet();
                for(Map.Entry entry:entrys){
                       
                        sum = sum +Double.parseDouble((String)entry.getValue());
                }
               
作者: 周朋飞    时间: 2012-6-28 21:34
既然写了 就多写点吧 ,其实对Map排序有两种方法,一种是题中所提用keySet方法,另一种方法更为高效 就是通过entrySet来做
double sum = 0;
                Set<Map.Entry<String, String>> entrys = amtMap.entrySet();
                for(Map.Entry entry:entrys){
                       
                        sum = sum +Double.parseDouble((String)entry.getValue());
                }
                最后那个方法可有可无,用来对id进行分组 看你个人需要




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2