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()
}
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()
}
将 address设为key 然后value 就是 User
下次记录来的时候找key为address的 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写个构造器,一次设置值
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);
}
在把数据放到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
}
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;
}
}}
可能你没清楚我的意思哦,map只能键值,你是以us.getAddress())) 做为KEY但是我的要的值是:用气量 、 总金额 、 抄表员 、总用户
或许把 用气量 总金额 抄表员 总用户 组合成一个String 我在来试下。
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;
}
}}
{
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出来,很浪费空间