import java.util.ArrayList;
import java.util.List;
public class ListOperate
{
public static void main(String[] args)
{
//一下数据不是直接来自数据库,最终被封装到 userList。
//要求及说明:分别对各个小区的【用气量,用气金额,以及用户个数进行统计】以下是测试数据实际中也是这样的,数据不是很大!
User u1 = new User();
u1.setAddress("双和园");u1.setMoney(20);u1.setGas(10);u1.setCopyMan("小张");//(注意:对于抄表员可以属于多个用户,但是不同的抄表员属于不同的小区!)
User u2 = new User();
u2.setAddress("双和园");u2.setMoney(20);u2.setGas(10);u2.setCopyMan("小张");
User u3 = new User();
u3.setAddress("双和园");u3.setMoney(20);u3.setGas(10);u3.setCopyMan("小张");

User u4 = new User();
u4.setAddress("南方花园");u4.setMoney(20);u4.setGas(10);u4.setCopyMan("小李");
User u5 = new User();
u5.setAddress("南方花园");u5.setMoney(20);u5.setGas(10);u5.setCopyMan("小李"); User u6 = new User();
u6.setAddress("百度空间");u6.setMoney(20);u6.setGas(10);u6.setCopyMan("小王");

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

//userList 是需要统计的。最终我想到的这样的结果:

/* 小区名      用气量     总金额   抄表员   总用户
--------------------------------------
双和园       30        60     小张     3
南方花园      20        40     小李    2
百度空间      10        20     小王    1   */

//在此声明一下,昨天我发过类似的贴子,有很多朋友热心回帖了,真的非常感谢您你们,因为我没有表达清楚,所以今天重新发贴。希望您们看到贴后愿意再次讨论。结束后分数奉上。Hhank u

//其实这个问题的焦点在于对一个List中相同的值进行重新包装,我虽然自己写了,但是总感觉写的很罗嗦,就不丢人了。就不想用最好的方法来实现,对于JAVA小弟是才学的,基础很差,在此感谢各位赐教,谢谢。
}
}
====================
public class User
{
private String name;//用户名
private String address;//小区名
private double money;//用气金额
private int gas;//用气量
private String copyMan;//抄表员         相应的getxxx(),setxxx()
}

解决方案 »

  1.   

    Give me you mailbox. I will send you some codes for you to read tonight...
      

  2.   

    和昨天的问题并无大的区别,用Map.
      

  3.   

    可以用个map来存吧
    将 address设为key 然后value 就是 User
    下次记录来的时候找key为address的 User
    把相应的数据相加
      

  4.   

    my email:       [email protected]我希望将它放在一个List<User>中,因为后面要对这个数据导出到 Excelmap 我尝试过了,实现起来也是比较烦的那。不知道5楼怎么实现的呢
      

  5.   

    List <User> userList = new ArrayList <User>();
    userList.add(u1);
    userList.add(u2);
    userList.add(u3);
    userList.add(u4);
    userList.add(u5);
    userList.add(u6); 
    User u1 = new User();
    u1.setAddress("双和园");u1.setMoney(20);u1.setGas(10);u1.setCopyMan("小张");
    不知道你要怎么提高效率
    User写个构造器,一次设置值
      

  6.   

    我要的是先对userList 中的对象进行按小区分组,然后在统计,楼上说的,这样能实现吗?
      

  7.   

    这个确实挺麻烦的   估计只用LIST很难实现你想要的结果啊 !
      

  8.   


       Map<String, User> map = new HashMap<String, User>();
            User user = null;
            if (map.containsKey(us.getAddress())) {
                user = (User) map.get(us.getAddress());
                user.setGas(user.getGas() + us.getGas());
                ...
            } else {
                map.put(us.getAddress(), us);
            }
      

  9.   

    建议使用SET
    在把数据放到LIST中时同时把 小区名和抄表员 放到SET里
    然后循环SET 并在SET循环中循环LIST中数据 例:while (it.hasNext()) {
      User u = (User)it.next();
      int count = 0;//用户个数
      for (int i = 0; i < userList.size(); i++) {
        User user = (User)userList.get(i);
        if (u.getAddress().equals(user.getAddress())) {
          money += user.getMoney();
          gas += user.getGas();
          count++;
        }
      }
      //把此条纪录插入EXCEL中,其中  小区名和抄表员直接取SET中的值就OK
    }
      

  10.   

    呵呵。久等了。来喽:import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;/** 
     * <p>功能描述: 统计小区用户燃气类</p>
     * @author  jack
     * @version 
     * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述] 
     */ 
    public class ListOperate {

    /**
     * <p>功能描述:统计出结果</p>
     * @param users
     * @return
     * @author:jack
     * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
     */
    public List<Result> statistic(List<User> users) {
    /**
     * 先按名称排序。其实我这里感觉还是应该有个抄表员ID在User类中。因为可能会有重名的现象的。
     */
    this.sortByName(users);
    List<Result> resultList = new ArrayList<Result>();
    int index = 0;
    int gasCount = 0;//用气总量
    int roomCount = 0;//用户总数
    double moneyCount = 0d;//用气总金额
    User oldUser = null;
    for(User user : users) {
    if(index == 0) {// 第一次先记录OldUser,以后通过抄表员不同进行统计
    oldUser = user;
    }
    //抄表员不同时,把上一个统计好的抄表员加入到Result中。
    if(!user.getCopyMan().equals(oldUser.getCopyMan())){
    Result result = new Result();
    result.setAddress(oldUser.getAddress());
    result.setCopyMan(oldUser.getCopyMan());
    result.setGasCount(gasCount);
    result.setMoneyCount(moneyCount);
    result.setRoomCount(roomCount);
    resultList.add(result);
    gasCount = 0;
    moneyCount = 0d;
    roomCount = 0;
    oldUser = user;
    }
    /**
     * 下面3行是统计用气量,总金额和抄了多少户
     */
    gasCount += user.getGas();
    moneyCount += user.getMoney();
    roomCount ++;
    /**
     * 下面是把最后一个抄表员的统计结果记录到Result中。
     */
    if(index == users.size()-1){
    Result result = new Result();
    result.setAddress(oldUser.getAddress());
    result.setCopyMan(oldUser.getCopyMan());
    result.setGasCount(gasCount);
    result.setMoneyCount(moneyCount);
    result.setRoomCount(roomCount);
    resultList.add(result);
    }
    index++;

    }
    return resultList;
    }

    @SuppressWarnings("unchecked")
    private void sortByName(List<User> users) {
            Collections.sort(users, new Comparator() {
    public int compare(Object o1, Object o2) {
    User user1 = (User) o1;
    User user2 = (User) o2;
    return user1.getCopyMan().compareTo(user2.getCopyMan());
    }
    }
    );
    }
     
    /**
     * <p>功能描述:初始化测试数据</p>
     * @return
     * @author:jack
     * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
     */
    public List<User> init() {
    User u1 = new User(); 
    u1.setAddress("双和园");u1.setMoney(20);u1.setGas(10);u1.setCopyMan("小张");//(注意:对于抄表员可以属于多个用户,但是不同的抄表员属于不同的小区!) 
    User u2 = new User(); 
    u2.setAddress("双和园");u2.setMoney(20);u2.setGas(10);u2.setCopyMan("小张"); 
    User u3 = new User(); 
    u3.setAddress("双和园");u3.setMoney(20);u3.setGas(10);u3.setCopyMan("小张");  User u4 = new User(); 
    u4.setAddress("南方花园");u4.setMoney(20);u4.setGas(10);u4.setCopyMan("小李"); 
    User u5 = new User(); 
    u5.setAddress("南方花园");u5.setMoney(20);u5.setGas(10);u5.setCopyMan("小李");  User u6 = new User(); 
    u6.setAddress("百度空间");u6.setMoney(20);u6.setGas(10);u6.setCopyMan("小王");  List <User> userList = new ArrayList <User>(); 
    userList.add(u1); 
    userList.add(u5); 
    userList.add(u2); 
    userList.add(u3); 
    userList.add(u4); 
    userList.add(u6); 
    return userList;
    } public static void main(String[] args) {
    ListOperate operate = new ListOperate();
    List<Result> results = operate.statistic(operate.init());
    for(Result result : results) {
    System.out.println(result.getAddress()+"\t"+result.getGasCount()+"\t"+result.getMoneyCount()+"\t"+result.getCopyMan()+"\t"+result.getRoomCount());
    }
    } class Result {
    private String address;//小区名 
    private double moneyCount;//用气金额 
    private int gasCount;//用气量 
    private String copyMan;//抄表员 
    private int roomCount;//用户

    /**********************************************************************
     * <p>功能描述:一下为上面属性的Setter和Getter方法</p>
     * @return
     * @author:jack
     * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
     */
    public String getAddress() {
    return address;
    }
    public void setAddress(String address) {
    this.address = address;
    }
    public double getMoneyCount() {
    return moneyCount;
    }
    public void setMoneyCount(double moneyCount) {
    this.moneyCount = moneyCount;
    }
    public int getGasCount() {
    return gasCount;
    }
    public void setGasCount(int gasCount) {
    this.gasCount = gasCount;
    }
    public String getCopyMan() {
    return copyMan;
    }
    public void setCopyMan(String copyMan) {
    this.copyMan = copyMan;
    }
    public int getRoomCount() {
    return roomCount;
    }
    public void setRoomCount(int roomCount) {
    this.roomCount = roomCount;
    }


    }

    /** 
     * <p>功能描述: User类,为了方便把它做成内部类了。</p>
     * @author  jack
     * @version 
     * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述] 
     */ 
    class User {
    private String name;//用户名 
    private String address;//小区名 
    private double money;//用气金额 
    private int gas;//用气量 
    private String copyMan;//抄表员 

    /**********************************************************************
     * <p>功能描述:一下为上面属性的Setter和Getter方法</p>
     * @return
     * @author:jack
     * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
     */
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    public String getAddress() {
    return address;
    }
    public void setAddress(String address) {
    this.address = address;
    }
    public double getMoney() {
    return money;
    }
    public void setMoney(double money) {
    this.money = money;
    }
    public int getGas() {
    return gas;
    }
    public void setGas(int gas) {
    this.gas = gas;
    }
    public String getCopyMan() {
    return copyMan;
    }
    public void setCopyMan(String copyMan) {
    this.copyMan = copyMan;
    }
    }}
      

  11.   


    可能你没清楚我的意思哦,map只能键值,你是以us.getAddress())) 做为KEY但是我的要的值是:用气量  、  总金额 、 抄表员  、总用户  
    或许把  用气量    总金额  抄表员  总用户 组合成一个String  我在来试下。
      

  12.   

    哪样不性?BTW:CSDN改版改的系统好慢!不如以前好用了。
      

  13.   

    已经改好import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;/** 
     * <p>功能描述: 统计小区用户燃气类</p>
     * @author  jack
     * @version 
     * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述] 
     */ 
    public class ListOperate {

    /**
     * <p>功能描述:统计出结果</p>
     * @param users
     * @return
     * @author:jack
     * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
     */
    public List<Result> statistic(List<User> users) {
    /**
     * 先按名称排序。其实我这里感觉还是应该有个抄表员ID在User类中。因为可能会有重名的现象的。
     */
    this.sortByName(users);
    List<Result> resultList = new ArrayList<Result>();
    int index = 0;
    int gasCount = 0;//用气总量
    int roomCount = 0;//用户总数
    double moneyCount = 0d;//用气总金额
    User oldUser = null;
    for(User user : users) {
    if(index == 0) {// 第一次先记录OldUser,以后通过抄表员不同进行统计
    oldUser = user;
    }
    //抄表员不同时,把上一个统计好的抄表员加入到Result中。
    //if(!user.getCopyMan().equals(oldUser.getCopyMan())){
    if(user.getCopyManId()!=oldUser.getCopyManId()){//这里用ID判断
    Result result = new Result();
    result.setAddress(oldUser.getAddress());
    result.setCopyMan(oldUser.getCopyMan());
    result.setGasCount(gasCount);
    result.setMoneyCount(moneyCount);
    result.setRoomCount(roomCount);
    result.setCopyManID(oldUser.getCopyManId());//加上ID显示
    resultList.add(result);
    gasCount = 0;
    moneyCount = 0d;
    roomCount = 0;
    oldUser = user;
    }
    /**
     * 下面3行是统计用气量,总金额和抄了多少户
     */
    gasCount += user.getGas();
    moneyCount += user.getMoney();
    roomCount ++;
    /**
     * 下面是把最后一个抄表员的统计结果记录到Result中。
     */
    if(index == users.size()-1){
    Result result = new Result();
    result.setAddress(oldUser.getAddress());
    result.setCopyMan(oldUser.getCopyMan());
    result.setGasCount(gasCount);
    result.setMoneyCount(moneyCount);
    result.setRoomCount(roomCount);
    result.setCopyManID(oldUser.getCopyManId());//加上ID显示
    resultList.add(result);
    }
    index++;

    }
    return resultList;
    }

    @SuppressWarnings("unchecked")
    private void sortByName(List<User> users) {
            Collections.sort(users, new Comparator() {
    public int compare(Object o1, Object o2) {
    User user1 = (User) o1;
    User user2 = (User) o2;
    //return user1.getCopyMan().compareTo(user2.getCopyMan());
    return user1.getCopyManId()-user2.getCopyManId()>0?1:0;
    }
    }
    );
    }
     
    /**
     * <p>功能描述:初始化测试数据</p>
     * @return
     * @author:jack
     * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
     */
    public List<User> init() {
    User u1 = new User(); 
    u1.setAddress("双和园");u1.setMoney(20);u1.setGas(10);u1.setCopyMan("小张");//(注意:对于抄表员可以属于多个用户,但是不同的抄表员属于不同的小区!) 
    u1.setCopyManId(1);
    User u2 = new User(); 
    u2.setAddress("双和园");u2.setMoney(20);u2.setGas(10);u2.setCopyMan("小张"); 
    u2.setCopyManId(1);
    User u3 = new User(); 
    u3.setAddress("双和园");u3.setMoney(20);u3.setGas(10);u3.setCopyMan("小张"); 
    u3.setCopyManId(1); User u4 = new User(); 
    u4.setAddress("南方花园");u4.setMoney(20);u4.setGas(10);u4.setCopyMan("小李"); 
    u4.setCopyManId(2);
    User u5 = new User(); 
    u5.setAddress("南方花园");u5.setMoney(20);u5.setGas(10);u5.setCopyMan("小李"); 
    u5.setCopyManId(2); User u6 = new User(); 
    u6.setAddress("百度空间");u6.setMoney(20);u6.setGas(10);u6.setCopyMan("小王"); 
    u6.setCopyManId(3); List <User> userList = new ArrayList <User>(); 
    userList.add(u1); 
    userList.add(u5); 
    userList.add(u2); 
    userList.add(u3); 
    userList.add(u4); 
    userList.add(u6); 
    return userList;
    } public static void main(String[] args) {
    ListOperate operate = new ListOperate();
    List<Result> results = operate.statistic(operate.init());
    for(Result result : results) {
    System.out.println(result.getAddress()+"\t"+result.getGasCount()+"\t"+result.getMoneyCount()+"\t"+result.getCopyMan()+"\t"+result.getCopyManID()+"\t"+result.getRoomCount());
    }
    } class Result {
    private String address;//小区名 
    private double moneyCount;//用气金额 
    private int gasCount;//用气量 
    private String copyMan;//抄表员 
    private int copyManID;//抄表员的ID
    private int roomCount;//用户

    /**********************************************************************
     * <p>功能描述:一下为上面属性的Setter和Getter方法</p>
     * @return
     * @author:jack
     * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
     */
    public String getAddress() {
    return address;
    }
    public void setAddress(String address) {
    this.address = address;
    }
    public double getMoneyCount() {
    return moneyCount;
    }
    public void setMoneyCount(double moneyCount) {
    this.moneyCount = moneyCount;
    }
    public int getGasCount() {
    return gasCount;
    }
    public void setGasCount(int gasCount) {
    this.gasCount = gasCount;
    }
    public String getCopyMan() {
    return copyMan;
    }
    public void setCopyMan(String copyMan) {
    this.copyMan = copyMan;
    }
    public int getRoomCount() {
    return roomCount;
    }
    public void setRoomCount(int roomCount) {
    this.roomCount = roomCount;
    }
    public int getCopyManID() {
    return copyManID;
    }
    public void setCopyManID(int copyManID) {
    this.copyManID = copyManID;
    }


    }

    /** 
     * <p>功能描述: User类,为了方便把它做成内部类了。</p>
     * @author  jack
     * @version 
     * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述] 
     */ 
    class User {
    private String name;//用户名 
    private String address;//小区名 
    private double money;//用气金额 
    private int gas;//用气量 
    private String copyMan;//抄表员 
    private int copyManId;//抄表员ID

    /**********************************************************************
     * <p>功能描述:一下为上面属性的Setter和Getter方法</p>
     * @return
     * @author:jack
     * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
     */
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    public String getAddress() {
    return address;
    }
    public void setAddress(String address) {
    this.address = address;
    }
    public double getMoney() {
    return money;
    }
    public void setMoney(double money) {
    this.money = money;
    }
    public int getGas() {
    return gas;
    }
    public void setGas(int gas) {
    this.gas = gas;
    }
    public String getCopyMan() {
    return copyMan;
    }
    public void setCopyMan(String copyMan) {
    this.copyMan = copyMan;
    }
    public int getCopyManId() {
    return copyManId;
    }
    public void setCopyManId(int copyManId) {
    this.copyManId = copyManId;
    }
    }}
      

  14.   

    Thank you 乌云和雨需求可以实现!you are greate
      

  15.   

    public static void addUser(User user, List<User> myList)
    {
            Iterator i=myList.iterator();
    while(i.hasNext())
            {
                User tempUser=(User)i.next();
                if(tempUser.address.equals(user.address))
                {
                    myList.remove(tempUser);
                    tempUser.money+=user.money;
                    myList.add(tempUser);
                    return;
                }
            }
            myList.add(user);
            return;
        }
    大概这样,不需要再弄个map出来,很浪费空间
      

  16.   

    乌云那个也要新建一个List,也比较浪费空间,当然如果楼主的数据量不大的话就没多大问题了