现在有一个List,里面有一个4个对象VoOrder,在VoOrder中有下面的属性(acctcode,acctno,amt,itemtype)和值acctcode acctno amt itemType
CASH 0000ITME 100.00 C
CASH 0000ITEM 1000.00 C
CASHD 11111ITME 100.00 C
CASH 0000ITEM 900.00 C
ADVICE 2222ITEM 100.00 C
CASH 0000ITEM 900.00 C现在我想把acctcode相同的合并成一个,同时汇总amt,也就说,结果变成下面的这样子acctcode acctno amt itemType
CASH 0000ITME 2900.00 C
CASHD 1111ITME 100.00 C
ADVICE 2222ITEM 100.00 C
不知道代码如何写,请高手帮忙,100分求助
CASH 0000ITME 100.00 C
CASH 0000ITEM 1000.00 C
CASHD 11111ITME 100.00 C
CASH 0000ITEM 900.00 C
ADVICE 2222ITEM 100.00 C
CASH 0000ITEM 900.00 C现在我想把acctcode相同的合并成一个,同时汇总amt,也就说,结果变成下面的这样子acctcode acctno amt itemType
CASH 0000ITME 2900.00 C
CASHD 1111ITME 100.00 C
ADVICE 2222ITEM 100.00 C
不知道代码如何写,请高手帮忙,100分求助
遍历放入
HashMap<String,VoOrder>
高手liushaoyi0704清给出一段清晰的代码,谢谢
100分全给你。
是不是只要acctcode相同,acctno和itemType也都相同?
List newList = null; //创建新的list
for(int i=0; i <orderList.size(); i++){ //stuList是你的那个封装好的list
VoOrder order = (VoOrder) orderList.get(i);
if(newList == null){
newList = new ArrayList();
newList.add(order);
}else{
for(int j=0; j <newList.size(); j++){
VoOrder order1 = (VoOrder) newList.get(j);
if(order1.getAcctcode().equals(order.getAcctcode())){
stu1.setAge(order1.getAmt() + order.getAmt()); //汇总amt
newList.add(order1);
}else{
newList.add(order);
}
}
}
}
是不是只要acctcode相同,acctno和itemType也都相同?
是这样的
再新定义个list2 ,把acctcode 相同的放在list2中,同时计算amt,然后再放入map中。
不知道这样行不行?!
你是把过滤后的结果放到一个LIST中,是吗 ?怎么出不来啊 !
Map<String,VoOrder> result = new HashMap<String,VoOrder>();//汇总辅助类。
for(VoOrder vo : list){
VoOrder sum = result.get(vo.getAcctcode());
if(sum==null){
VoOrder newObj = new VoOrder();
newObj.setAcctcode(vo.getAcctcode());newObj.setAcctno(vo.getAcctno());
newObj.setAmt(vo.getAmt());newObj.setItemType(vo.getItemType());
result.put(vo.getAcctcode(),newObj);
}else{
sum.setAmt(sum.getAmt()+vo.getAmt());
}
}
List<VoOrder> result = new ArrayList<VoOrder>(sum.values());
//result就是楼主要的汇总结果。
方法可以,但是似乎效率不高,看看api,是否可以直接在原list中操作
Map<String,VoOrder> result = new HashMap<String,VoOrder>();
for(VoOrder stu : list){
if (result.containtsKey(stu.acctcode))
{
VoOrder temp = result.get(stu.acctcode);
float amt = temp.getAmt()+stu.getAmt();
temp.setAmt(amt);
} else {
VoOrder temp = new VoOrder();
temp.setAcctcode(stu.getAcctcode());
temp.setAcctno(stu.getAcctno());
temp.setItemType(stu.getItemType());
temp.setAmt(stu.getAmt());
result.put(stu.getAcctcode(),temp);
}}
//最后结果在result里面。
ArrayList<VoOrder> result=new ArrayList<VoOrder>();
HashMap<String,VoOder> map=new HashMap<String,VoOrder>();
for(VoOrder vo:myList){
if(map.get(vo.acctno)!==null){
vo.amt+=map.get(vo.acctno).amt;
}
map.put(vo.acctno,vo);
}
result.addAll(map.value()s);
}
ArrayList<VoOrder> result=new ArrayList<VoOrder>();
HashMap<String,VoOder> map=new HashMap<String,VoOrder>();
for(VoOrder vo:myList){
if(map.get(vo.acctno)!==null){
vo.amt+=map.get(vo.acctno).amt;
}
map.put(vo.acctno,vo);
}
result.addAll(map.values());
}
我最终还是想用这个LIST,也就是说我原来可能插入6行,现在过滤后我只需插入3行,好像你没有把结果放到我需要的LIST中啊 。
你写的函数,一直循环,没有退出来。
if(newList == null){
newList = new ArrayList();
newList.add(order);
}else{
for(int j=0; j <newList.size(); j++){
VoOrder order1 = (VoOrder) newList.get(j);
if(order1.getAcctcode().equals(order.getAcctcode())){
order1.remove(order1);//先删除
order1.setAge(order1.getAmt() + order.getAmt());//汇总amt newList.add(order1); //再添加 }else{
newList.add(order);
}
}
}
}
这个要求太简单了,不用新建result了,用myList.clear()把myList清空,再myList.addAll(map.values()).就可以了.
你的函数还是有重复的数据。
现在我执行同样的操作,还是从 LIST中取VoOrder,只不过我的LIST中的VoOrder过滤了,去掉重复的行。
也就是把LIST过滤后,在重新放到一个LIST中,是这样的吗?如果是,请高手们给出代码,
我还在学习中,请高手们帮助啊 ,万分谢谢
这么多重复数据??
其实可以优化一下sql语句不就解决问题了么
public class VoOrder { private String acctcode;
private String acctno;
private double amt;
private String itemType;
/**
* @return the acctcode
*/
public String getAcctcode() {
return acctcode;
}
/**
* @return the acctno
*/
public String getAcctno() {
return acctno;
}
/**
* @return the amt
*/
public double getAmt() {
return amt;
}
/**
* @return the itemType
*/
public String getItemType() {
return itemType;
}
/**
* @param acctcode the acctcode to set
*/
public void setAcctcode(String acctcode) {
this.acctcode = acctcode;
}
/**
* @param acctno the acctno to set
*/
public void setAcctno(String acctno) {
this.acctno = acctno;
}
/**
* @param amt the amt to set
*/
public void setAmt(double amt) {
this.amt = amt;
}
/**
* @param itemType the itemType to set
*/
public void setItemType(String itemType) {
this.itemType = itemType;
}
}
测试类public class Test{ public static void main(String[] orgs)
{ /**这是在模拟你给出的数据*/
//begin
List<VoOrder> list=new ArrayList<VoOrder>();
VoOrder vo=null;
String[][] dateArryA={{"CASH","0000ITME","100.00","C"},
{"CASH","0000ITME","1000.00","C"},
{"CASHD","11111ITME","100.00","C"},
{"CASH","0000ITME","900.00","C"},
{"ADVICE","2222ITEM","100.00","C"},
{"CASH","0000ITME","900.00","C"}
};
for(int i=0;i<6;i++)
{
vo=new VoOrder();
vo.setAcctcode(dateArryA[i][0].toString());
vo.setAcctno(dateArryA[i][1].toString());
vo.setAmt(Double.valueOf(dateArryA[i][2]));
vo.setItemType(dateArryA[i][3].toString());
list.add(vo);
}
//end
ArrayList<VoOrder> resultList=new ArrayList<VoOrder>();
HashMap<String,VoOrder> map=new HashMap<String,VoOrder>();
for(VoOrder voOrder:list){
if(!map.isEmpty()&&map.containsKey(voOrder.getAcctcode())){
voOrder.setAmt(voOrder.getAmt()+map.get(voOrder.getAcctcode()).getAmt());
map.put(voOrder.getAcctcode(),voOrder);
}
else
{
map.put(voOrder.getAcctcode(),voOrder);
}
}
Set<String> set = map.keySet();
System.out.println("Acctcode"+ " " +"Acctno"+" "+"Amt"+" "+"ItemType");
for (String key : set) {
System.out.println(key + " " +map.get(key).getAcctno() +" "+map.get(key).getAmt()+" "+map.get(key).getItemType());
}
}
}
Acctcode Acctno Amt ItemType
CASHD 11111ITME 100.0 C
ADVICE 2222ITEM 100.0 C
CASH 0000ITME 2900.0 C这是测试结果,这里的ArrayList<VoOrder> resultList=new ArrayList<VoOrder>();
没有用到。
for(int i=0; i <orderList.size(); i++){ //orderList是你的那个封装好的list
VoOrder order = (VoOrder) orderList.get(i);
if(newList == null){
newList = new ArrayList();
newList.add(order);
}else{
boolean isexists = false;
for(int j=0; j <newList.size(); j++){
VoOrder order1 = (VoOrder) newList.get(j);
if(order1.getAcctcode().equals(order.getAcctcode())){
order1.remove(order1);//先删除
order1.setAge(order1.getAmt() + order.getAmt());
newList.add(order1); //再添加
isexists = true;
break;
}
}
if(!isexists)
newlist.add(order);
}
}
select acctcode, acctno, sum( amt ) as amt , itemType , from TableName group by acctcode, acctno, itemType
你sql的statement就是从这个list中拿元素
利用代码处理后List newList = new ArrayList(); //这里可以使用和你原list相同类型的list
for(int i=0; i <aaa.size(); i++){
VoOrder order = (VoOrder) aaa.get(i);
if(newList == null){
newList = new ArrayList();
newList.add(order);
}else{
for(int j=0; j <newList.size(); j++){
boolean flag=false;
VoOrder order1 = (VoOrder) newList.get(j);
if(order1.getAcctcode().equals(order.getAcctcode())){
flag=true;
order1.remove(order1);//先删除
order1.setAge(order1.getAmt() + order.getAmt());//汇总amt newList.add(order1);
}
if(flag=false&&newList.size==j+1){
newList.add(order);
}
}
}
}最后这个名字为newList的就是整合后的list,你可以从这个list中读取数据到数据库也许还有错误,公司的电脑没有java环境,不好测试,实现的方法很多,用map可能更简单,楼主还是需要理解思想后自己考虑解决才能应对以后同样的问题
Integer count = 0;
List<VoOrder> newList = null; // 创建新的list
for (int i = 0; i < list.size(); i++)
{ // orderList是你的那个封装好的list
VoOrder order = (VoOrder) list.get(i);
if(newList == null)
{
newList = new ArrayList<VoOrder>();
newList.add(order);
}
else{
boolean isexists = false;
for (int j = 0; j < newList.size(); j++){
VoOrder order1 = newList.get(j);
if(order1.getAcctcode().equals(order.getAcctcode())){
newList.remove(order1);// 先删除
order1.setAmt(order1.getAmt() + order.getAmt());
newList.add(order1); // 再添加
isexists = true;
break;
}
}
if(!isexists)
newList.add(order);
}
}
Map <String,VoOrder> result = new HashMap <String,VoOrder>();//汇总辅助类。
for(VoOrder vo : list){ //遍历List对象,进行汇总
VoOrder sum = result.get(vo.getAcctcode()); //查看辅助map里面有没有汇总过类似的对象
if(sum==null){ //没汇总过这个对象
VoOrder newObj = new VoOrder(); //创建一个用于汇总的对象,目前只汇总当前对象。
newObj.setAcctcode(vo.getAcctcode());newObj.setAcctno(vo.getAcctno());
newObj.setAmt(vo.getAmt());newObj.setItemType(vo.getItemType());
result.put(vo.getAcctcode(),newObj);
}else{ //汇总过类似的对象,继续汇总就可以了。
sum.setAmt(sum.getAmt()+vo.getAmt()); //汇总amt的值。
}
}
//将汇总后的结果放置到新的List对象中
List <VoOrder> result = new ArrayList <VoOrder>(sum.values());
//result就是楼主要的汇总结果。
public static List add(List oldList) { List newList = new ArrayList();
for (Iterator iterator = oldList.iterator(); iterator.hasNext();) { Object obj = (Object) iterator.next();
for (Iterator iterator2 = newList.iterator(); iterator2.hasNext();) {
Object newObj = (Object) iterator2.next();
if(obj.getId() == newObj.getId()) {
newList.remove(newObj);
obj.setAge(newObj.getAge() + obj.getAge());
break;
}
}
newList.add(obj);
}
return newList;
}
List<VoOrder> newList = new ArrayList<VoOrder>();
Map<String,Double> record = new HashMap<String,Double>();
for(VoOrder order:yourList){
if(record.containsKey(order.getAcctcode())){
record.get(order.getAcctcode())+order.getAmt();
}else{
record.put(order.getAcctcode(),order.getAmt());
newList.add(order);
}
}
for(VoOrder order:newList){
order.setAmt(record.get(order.getAcctcode()));
}
//newList 就是你想要的
我的意思很简单,就是如果重复,就合并,如果不重复,就原样操作,由于原来是循环List,进行插入数据库操作,因此我还想用循环List来插入数据库。
public class CountVoOrder {
public static void main(String args[]) {
List<VoOrder> orderList = new ArrayList<VoOrder>();
orderList.add(new VoOrder("CASH", "0000ITME", 100.00, "C"));
orderList.add(new VoOrder("CASH", "0000ITME", 1000.00, "C"));
orderList.add(new VoOrder("CASHD", "11111ITME", 100.00, "C"));
orderList.add(new VoOrder("CASH", "0000ITME", 900.00, "C"));
orderList.add(new VoOrder("ADVICE", "2222ITEM", 100.00, "C"));
orderList.add(new VoOrder("CASH", "0000ITEM", 900.00, "C")); Map<String, VoOrder> orderMap = new HashMap<String, VoOrder>();
for(VoOrder order: orderList){
if(order != null && order.getAcctcode() != null){
if (orderMap.get(order.getAcctcode()) == null){
orderMap.put(order.getAcctcode(), order);
}else{
orderMap.get(order.getAcctcode()).setAmt(orderMap.get(order.getAcctcode()).getAmt() + order.getAmt());
}
}
}
// 其实这样就已经可以循环了:
// for(String key: orderMap.keySet()){
// VoOrder order = orderMap.get(key);
// System.out.println(order.getAcctcode() + "\t\t" + order.getAcctno()+ "\t" + order.getAmt() + "\t\t" + order.getItemtype() );
// }
orderList.clear();
orderList.addAll(orderMap.values());
System.out.println("acctcode\tacctno\t\tamt\t\titemType");
for(VoOrder order: orderList){
System.out.println(order.getAcctcode() + "\t\t" + order.getAcctno()+ "\t" + order.getAmt() + "\t\t" + order.getItemtype() );
}
}}
如果是可以用SQL查询的时候直接处理,
select acctcode,acctno,sum(amt),itemType from VoOrder group by acctcode;
这个有问题
这是运行结果acctcode acctno amt itemType
CASH 0000ITME 2900.0 C
CASHD 11111ITME 100.0 C
ADVICE 2222ITEM 100.0 C这是VoOrder类public class VoOrder {
String acctcode;
String acctno;
Double amt;
String itemtype;
VoOrder() { }
VoOrder(String acctcode, String acctno, Double amt, String itemtype) {
this.acctcode = acctcode;
this.acctno = acctno;
this.amt = amt;
this.itemtype = itemtype;
}
public String getAcctcode() {
return acctcode;
}
public void setAcctcode(String acctcode) {
this.acctcode = acctcode;
}
public String getAcctno() {
return acctno;
}
public void setAcctno(String acctno) {
this.acctno = acctno;
}
public Double getAmt() {
return amt;
}
public void setAmt(Double amt) {
this.amt = amt;
}
public String getItemtype() {
return itemtype;
}
public void setItemtype(String itemtype) {
this.itemtype = itemtype;
}
}如果amt有空值的话加点判断好了。
我建议你用SQL直接就先过滤了,比如,
你取出acctcode = CASH,借助数据库会很快,不要拿出来再用程序自己弄,慢,
还是一个原因,Java内存管理原因
否则Map是最好的结构,快捷,方便。如果Map因为内存问题而不可用
希望你可以去SQL版问问。我可以很明确的告诉你,绝对可以解决。数据库是我们的朋友,放下你的戒心和烦躁
import java.util.Collections;
import java.util.List;public class ATest { /**
* @param args
*/
public static void main(String[] args) { VoOrder v1 = new VoOrder("CASH", "0000ITME", 100.00, "C");
VoOrder v2 = new VoOrder("CASH", "0000ITME", 1000.00, "C");
VoOrder v3 = new VoOrder("CASHD", "11111ITMEE", 100.00, "C");
VoOrder v4 = new VoOrder("CASH", "0000ITME", 100.00, "C");
VoOrder v5 = new VoOrder("CASH", "0000ITME", 900.00, "C");
VoOrder v6 = new VoOrder("ADVICE", "2222ITEM", 100.00, "C");
VoOrder v7 = new VoOrder("CASH", "0000ITME", 900.00, "C"); List<VoOrder> list = new ArrayList<VoOrder>();
list.add(v1);
list.add(v2);
list.add(v3);
list.add(v4);
list.add(v5);
list.add(v6);
list.add(v7); // 归并
List<VoOrder> lists = merge(list); // 打印验证
for (VoOrder v : lists) {
System.out.println(v.getAcctcod() + ":" + v.getAcctno() + ":"
+ v.getAmt() + ":" + v.getItemtype());
}
} public static class VoOrder implements Comparable<VoOrder> { private String acctcod;
private String acctno;
private double amt;
private String itemtype; public VoOrder() {
}; public VoOrder(String acctcod, String acctno, double amt,
String itemtype) {
this.acctcod = acctcod;
this.acctno = acctno;
this.amt = amt;
this.itemtype = itemtype;
} public String getAcctcod() {
return acctcod;
} public void setAcctcod(String acctcod) {
this.acctcod = acctcod;
} public String getAcctno() {
return acctno;
} public void setAcctno(String acctno) {
this.acctno = acctno;
} public String getItemtype() {
return itemtype;
} public void setItemtype(String itemtype) {
this.itemtype = itemtype;
} public int compareTo(VoOrder o) {
return this.acctno.compareTo(o.getAcctno());
} public double getAmt() {
return amt;
} public void setAmt(double amt) {
this.amt = amt;
} } public static List<VoOrder> merge(List<VoOrder> lists) {
// 先排序,将acctno相同的排在一起
Collections.sort(lists); List<VoOrder> results = new ArrayList<VoOrder>();
VoOrder first = lists.get(0); VoOrder current = null;
for (int i = 1; i < lists.size(); i++) {
current = lists.get(i);
if (first.getAcctno().equals(current.getAcctno())) {
double sum = first.getAmt();
first.setAmt(sum += current.getAmt());
} else {
VoOrder newVo = new VoOrder();
newVo.setAcctcod(first.getAcctcod());
newVo.setAcctno(first.getAcctno());
newVo.setAmt(first.getAmt());
newVo.setItemtype(first.getItemtype());
results.add(newVo);
first = current;
}
}
results.add(current);
return results;
}}
import java.util.Collections;
import java.util.List;public class ATest { /**
* @param args
*/
public static void main(String[] args) { VoOrder v1 = new VoOrder("CASH", "0000ITME", 100.00, "C");
VoOrder v2 = new VoOrder("CASH", "0000ITME", 1000.00, "C");
VoOrder v3 = new VoOrder("CASHD", "11111ITMEE", 100.00, "C");
VoOrder v4 = new VoOrder("CASH", "0000ITME", 100.00, "C");
VoOrder v5 = new VoOrder("CASH", "0000ITME", 900.00, "C");
VoOrder v6 = new VoOrder("ADVICE", "2222ITEM", 100.00, "C");
VoOrder v7 = new VoOrder("CASH", "0000ITME", 900.00, "C");
VoOrder v8 = new VoOrder("ADVICE", "2222ITEM", 100.00, "C"); List<VoOrder> list = new ArrayList<VoOrder>();
list.add(v1);
list.add(v2);
list.add(v3);
list.add(v4);
list.add(v5);
list.add(v6);
list.add(v7);
list.add(v8); // 归并
List<VoOrder> lists = merge(list); // 打印验证
for (VoOrder v : lists) {
System.out.println(v.getAcctcod() + ":" + v.getAcctno() + ":"
+ v.getAmt() + ":" + v.getItemtype());
}
} public static class VoOrder implements Comparable<VoOrder> { private String acctcod;
private String acctno;
private double amt;
private String itemtype; public VoOrder() {
}; public VoOrder(String acctcod, String acctno, double amt,
String itemtype) {
this.acctcod = acctcod;
this.acctno = acctno;
this.amt = amt;
this.itemtype = itemtype;
} public String getAcctcod() {
return acctcod;
} public void setAcctcod(String acctcod) {
this.acctcod = acctcod;
} public String getAcctno() {
return acctno;
} public void setAcctno(String acctno) {
this.acctno = acctno;
} public String getItemtype() {
return itemtype;
} public void setItemtype(String itemtype) {
this.itemtype = itemtype;
} public int compareTo(VoOrder o) {
return this.acctno.compareTo(o.getAcctno());
} public double getAmt() {
return amt;
} public void setAmt(double amt) {
this.amt = amt;
} } public static List<VoOrder> merge(List<VoOrder> lists) {
// 先排序,将acctno相同的排在一起
Collections.sort(lists); List<VoOrder> results = new ArrayList<VoOrder>();
VoOrder first = lists.get(0); VoOrder current = null;
java.util.Iterator<VoOrder> it = lists.iterator();
while (it.hasNext()) {
current = it.next();
if (first.getAcctno().equals(current.getAcctno())) {
double sum = first.getAmt();
first.setAmt(sum += current.getAmt());
} else {
VoOrder newVo = new VoOrder();
newVo.setAcctcod(first.getAcctcod());
newVo.setAcctno(first.getAcctno());
newVo.setAmt(first.getAmt());
newVo.setItemtype(first.getItemtype());
results.add(newVo);
first = current;
}
}
results.add(first);
return results;
}}