package zdx;import java.util.ArrayList;
import java.util.List;
public class ListOperate
{
public static void main(String[] args)
{
User u1=new User();
u1.setAddress("双和园");u1.setMoney(20);
User u2=new User();
u2.setAddress("双和园");u2.setMoney(30);
User u3=new User();
u3.setAddress("双和园");u3.setMoney(50);
User u4=new User();
u4.setAddress("南方花园");u4.setMoney(40);
User u5=new User();
u5.setAddress("南方花园");u5.setMoney(20);
User u6=new User();
u6.setAddress("百度空间");u6.setMoney(90);
        
List<User> userList=new ArrayList<User>();
userList.add(u1);
userList.add(u2);
userList.add(u3);
userList.add(u4);
userList.add(u5);
userList.add(u6);

for(User u:userList){
System.out.println(u.getAddress()+"------"+u.getMoney());
}
/* 打印结果为:
     双和园------20.0
双和园------30.0
双和园------50.0
南方花园------20.0
南方花园------20.0
百度空间------900.0*/

//==================================现在我想要的结果的是:
/* 打印结果为:
     双和园------100.0
南方花园------40.0
百度空间------90.0*/  //要得到这样的结果请问怎样实现呢,并把它们放到List中????????我自己写的效率很差。心里和不爽,还是请高手指教啊。谢谢
}
}
package zdx;public class User
{
private String name;
private double money;
private String address; public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public double getMoney()
{
return money;
}
public void setMoney(double money)
{
this.money = money;
}
public String getAddress()
{
return address;
}
public void setAddress(String address)
{
this.address = address;
}
}

解决方案 »

  1.   

    声明 User u7=new User(); u7.setMoney(u1.getMoney()+u2.getMoney()+u3.getMoney());
    //上面可能需要类型转化 最后打印u7就行
    不过楼主效率真是不高呵
      

  2.   

    Write another class to realize your function...
      

  3.   

    好像common collection 中有个 bag, jdk6 中似乎也加了这个bag, 你找下看
      

  4.   

    在for循环中用MAP试试!键值对,相同键的值相加,即可得到你要的结果
      

  5.   

    建一个map,address作为键,list作值.这个list里面放所有address相同的User.
    迭代map,将list里面所有user的 money 加起来.
      

  6.   

    建一个map,address作为键,list作值.这个list里面放所有address相同的User.
    迭代map,将list里面所有user的 money 加起来.
      

  7.   

    如果你的数据来自数据库, select name,sum(money) from ..... where ....group by name如果你的数据来自文件 ,说明你的数据是以只读行形式存在(如果是可读写的,那么你就应该弄到数据库里,要不操作,管理更麻烦),既然是只读,缓存起来就OK了,用笨方法给加起来 (效率不会成为你系统的瓶颈,因为你只加载一次,就算用了一个小时,有什么关系嘛?)。如果是程序写死的,那就更没什么好说的了,只接存你想要的结果就OK了。
      

  8.   

    Here is my advice:Write a map as a variable of class User. For example:
    public class User 

    private String name; 
    private double money; 
    private String address; 
    private HashMap<String, Double> map = new HashMap<String, Double>(); //Do you see this?public String getName() 

    return name; 

    public void setName(String name) 

    this.name = name; 

    public double getMoney() 

    return money; 

    public void setMoney(double money) 

    this.money = money; 

    public String getAddress() 

    return address; 

    public void setAddress(String address) 

    this.address = address; 

    } public HashMap<String, Double> setMap(...){//Do something here...
    ...
    return map;
    }pulbic String toString(){//Do something here...
    return ...;  
    }
    The above codes are only a draft...You need to write more...
      

  9.   

    I hope you know what I am talking about. I have no IDE here...
      

  10.   

    小区名称个数一定还是不一定啊?
    这些数据怎么来的啊<
    双和园------20.0
    双和园------30.0
    双和园------50.0
    南方花园------20.0
    南方花园------20.0
    百度空间------900.0
    >你是不是想要一个类似于:
    List<User> getSummary(List<User> users);接口的实现啊?
      

  11.   

    自己写个ArrayList的子类,然后重写它的add方法,现在里面查找address,找不到就添加,找到了就直接加金额
      

  12.   

    import java.util.*;
    public class Test { 
        public static void main(String args[]){ 
         Map map = new HashMap();
         User u1=new User(); 
    u1.setAddress("双和园");u1.setMoney(20); 
    User u2=new User(); 
    u2.setAddress("双和园");u2.setMoney(30); 
    User u3=new User(); 
    u3.setAddress("双和园");u3.setMoney(50);
    User u4=new User(); 
    u4.setAddress("南方花园");u4.setMoney(40); 
    User u5=new User(); 
    u5.setAddress("南方花园");u5.setMoney(20); 
    User u6=new User(); 
    u6.setAddress("百度空间");u6.setMoney(90);
          List <User> userlist=new  ArrayList<User>();
          userlist.add(u1);
          userlist.add(u4);
          userlist.add(u3);
          userlist.add(u2);
          userlist.add(u5);
          userlist.add(u6);
          for(User user:userlist) {
          Double freq =(Double)map.get(user.getAddress());
          map.put(user.getAddress(),(freq==null?user.getMoney():freq+user.getMoney()));
          }
         System.out.println(map);
        } 
    }class User { 
    private String name; 
    private double money; 
    private String address;  public String getName() { 
    return name; 


    public void setName(String name) { 
    this.name = name; 


    public double getMoney() { 
    return money; 


    public void setMoney(double money) { 
    this.money = money; 


    public String getAddress() { 
    return address; 


    public void setAddress(String address) { 
    this.address = address; 


    public String toString() {
    return this.getAddress()+"------"+this.getMoney(); 
    }
    } 写的不好别怪
      

  13.   

    用hashmap不行,他add的目的是没有相同地址就添加一项,有了相同地址就金额相加,如果用hashmap,add会把旧值覆盖掉
    当然你也可以直接用HashMap或者ArrayList,但是要把你现在写add方法的地方都做修改,先查找,找到了就修改金额,没找到就直接添加,不过这样还不如自己写个子类然后重写add方法
      

  14.   

    前面你写的就不改了,加完userList后变成下面代码,就可实现。
                    Map<String, Double> map = new HashMap<String, Double>();
    for (User user : userList) {
    String add = user.getAddress();
    double money = user.getMoney();
    if (map.containsKey(add)) {
    money = map.get(add) + money;
    }
    map.put(add, money);
    } Iterator<String> iter = map.keySet().iterator();
    while (iter.hasNext()) {
    String key = iter.next();
    System.out.println(key + "------" + map.get(key));
    }
      

  15.   

    你这样多用一个HashMap,如果用户列表很大的话,很浪费空间
      

  16.   

    package test;import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;public class ListOperate {

    public static List<User> getSummary(List<User> users){


    return new ArrayList<User>();
    }

    public static void main(String[] args) {
    User u1 = new User();
    u1.setAddress("双和园");
    u1.setMoney(20);
    User u2 = new User();
    u2.setAddress("双和园");
    u2.setMoney(30);
    User u3 = new User();
    u3.setAddress("双和园");
    u3.setMoney(50);
    User u4 = new User();
    u4.setAddress("南方花园");
    u4.setMoney(40);
    User u5 = new User();
    u5.setAddress("南方花园");
    u5.setMoney(20);
    User u6 = new User();
    u6.setAddress("百度空间");
    u6.setMoney(90); List<User> userList = new ArrayList<User>();
    userList.add(u1);
    userList.add(u2);
    userList.add(u3);
    userList.add(u4);
    userList.add(u5);
    userList.add(u6);

    Collections.sort(userList, new Comparator<User>(){
    public int compare(User o1, User o2) {
    return o1.getAddress().compareTo(o2.getAddress());
    }
    }); String ua = null;
    double s = 0;
    for (User u : userList) {
    if (ua == null || !ua.equals(u.getAddress())) {
    if(ua != null) System.out.println(ua+"------"+s); 
    s = 0;
    ua = u.getAddress();
    }
    s += u.getMoney();
    }
    System.out.println(ua+"------"+s); 
    }
    }class User {
    private String name;
    private double money;
    private String address; public String getName() {
    return name;
    } public void setName(String name) {
    this.name = name;
    } public double getMoney() {
    return money;
    } public void setMoney(double money) {
    this.money = money;
    } public String getAddress() {
    return address;
    } public void setAddress(String address) {
    this.address = address;
    }
      

  17.   

    List <User> userList=new ArrayList <User>(); 
      改成:
    List<User> userList = new ArrayList<User>(){
    public boolean add(User e) {
    int index = indexOf(e);
    if (index < 0) {
    return super.add(e);

    User user = get(index);
    user.setMoney(user.getMoney() + e.getMoney());
    return true;
    }
    };
    同时给User实现按地址比较的equals和hashcode方法
    public int hashCode() {
    return address.hashCode();
    } public boolean equals(Object obj) {
    return address.equals(((User)obj).address);
    }
      

  18.   

    建议不要改写equals和hashcode方法,说不定在其他地方会用到
      

  19.   

    哈哈,重载HashMap的put方法:
    import java.util.HashMap;public class ListOperate {
    public static void main(String[] args) {
    User u1 = new User();
    u1.setAddress("双和园");
    u1.setMoney(20);
    User u2 = new User();
    u2.setAddress("双和园");
    u2.setMoney(30);
    User u3 = new User();
    u3.setAddress("双和园");
    u3.setMoney(50);
    User u4 = new User();
    u4.setAddress("南方花园");
    u4.setMoney(40);
    User u5 = new User();
    u5.setAddress("南方花园");
    u5.setMoney(20);
    User u6 = new User();
    u6.setAddress("百度空间");
    u6.setMoney(90); HashMap<String, Double> userList=new HashMap<String, Double>()
    {
    public Double put(String obj, Double obj1)
    {
    if(super.containsKey(obj))
    {
    Double x=(Double)get(obj);
    double y=x.doubleValue()+obj1;
    super.put(obj, y);
    }else
    {
    super.put(obj, obj1);
    }
    return null;
    }
    };

    userList.put(u1.getAddress(),u1.getMoney());
    userList.put(u2.getAddress(),u2.getMoney());
    userList.put(u3.getAddress(),u3.getMoney());
    userList.put(u4.getAddress(),u4.getMoney());
    userList.put(u5.getAddress(),u5.getMoney());
    userList.put(u6.getAddress(),u6.getMoney()); System.out.println(userList.toString());
    }
    }class User {
    private String name; private double money; private String address; public String getName() {
    return name;
    } public void setName(String name) {
    this.name = name;
    } public double getMoney() {
    return money;
    } public void setMoney(double money) {
    this.money = money;
    } public String getAddress() {
    return address;
    } public void setAddress(String address) {
    this.address = address;
    }
    }输出:{双和园=100.0, 百度空间=90.0, 南方花园=60.0}
      

  20.   


    public static void main(String args []){
      HashMap<String,Float> users = new HashMap<String,Float>();
      addUser(users,"双和园",20f);
      addUser(users,"双和园",30f);
      addUser(users,"双和园",50f);
      addUser(users,"南方花园",20f);
      addUser(users,"南方花园",20f);
      addUser(users,"南方花园",900f);  for(String key:users.keySet()){
        System.out.println(key+"------"+users.get(key)); 
      }
    }
    public static void addUser(Map<String,Float> cache,String address,float money){
      if(cache.containsKey(address)){
        float m = cache.get(address);
        cache.put(address,m+money);
      }else{
        cache.put(address,money);
      }
    }
      

  21.   

    如果不想用Map就在User类上想办法,当然就不能new了,如果单实例(Singleton)再加一些静态方法也许行,只是我的想法,没想具体实现,效率应该和Map一样
      

  22.   

    List强调的是所存储元素的先后顺序。
    Set强调的是所存储元素的各不相同。
    Map强调的是键值关系。当然,键不能相同。所以,推荐使用HashMap来解决这个问题。
    List的查找方式,一般都是遍历查找。
    HashMap查找,是通过hasCode,效率要高一些。我26楼的代码,给楼主提示一下。
    嘿嘿
      

  23.   

    package packageA;import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;public class TestUser {

    public static void main(String[] args) {
    Map map = new HashMap();

    User u1 = new User();
    User u2 = new User();
    User u3 = new User();
    User u4 = new User();
    User u5 = new User();
    User u6 = new User();

    u1.setAddress("双和园");
    u1.setMoney(20);
    u2.setAddress("双和园");
    u2.setMoney(30);
    u3.setAddress("双和园");
    u3.setMoney(50);
    u4.setAddress("南方花园");
    u4.setMoney(40);
    u5.setAddress("南方花园");
    u5.setMoney(20);
    u6.setAddress("百度空间");
    u6.setMoney(90);

    List<User> list = new ArrayList<User>();
    list.add(u1);
    list.add(u2);
    list.add(u3);
    list.add(u4);
    list.add(u5);
    list.add(u6);

    for (User u : list) {
    Double key = (Double)map.get(u.getAddress());
    map.put(u.getAddress(), (key == null ? u.getMoney() : key + u.getMoney()));
    }
    System.out.println(map);
    }
    }
      

  24.   


        //根据需求定义map的存放位置。
        //不想在set里面进行计算,也可遍历一遍,或者在add()的时候,把这个map建立出来。
        //数据量大的话,还是建议用数据库吧
        private static final Map<String, Double> map = new HashMap<String, Double>();    public void setMoney(double money) {
            Double temp = map.get(address);
            if (temp == null) {
                map.put(address, money);
            } else {
                map.put(address, temp + (money - this.money));
            }
            this.money = money;
        }