将List中重复值合并,并返回一个list

一个List中有多个表的对象 表对象有5个字段,所有对象的count字段都为1,现在想把name相等的对象合并,并且count会变成合并了几个就变为几。。。就是List中有10个表对象,其中3个对象的name相等,就把他们合并为8个,并且那个3合一的对象count是3

1.重写equals方法,name相同即为相等
2.新建一个List,用来放结果。
3.遍历旧的List,如果新的list中存在名字相同的,则新的List中该元素的count+1. 如果不存在,则放入新的List

示例代码:

//测试类
public class ListTest {
public static void main(String[] args) {

    List<ListTestObject> oldList = new ArrayList<>();
    //模拟数据
    oldList.add(new ListTestObject("jack", 1));
    oldList.add(new ListTestObject("jerry", 1));
    oldList.add(new ListTestObject("jone", 1));
    oldList.add(new ListTestObject("jerry", 1));
    oldList.add(new ListTestObject("jone", 1));

    List<ListTestObject> newList = new ArrayList<>();
    for (ListTestObject testObjOld : oldList) {
        // 遍历新的List,看是否存在,存在则count加一,不存在则放入新的List
        boolean flag = false;
        for (ListTestObject testObjNew : newList) {
            if (testObjNew.equals(testObjOld)) {
                // 新的List中存在名字相同的,则count+1
                testObjNew.setCount(testObjNew.getCount() + 1);
                flag = true;
            }
        }

        // 新的List中不存在
        if (!flag) {
            newList.add(testObjOld);
        }
    }

    System.out.println(newList);


}

}

//实体类
public class ListTestObject {
private String name;
private int count;
//因为示例只用了name,count,另外3个属性先不写。

public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public int getCount() {
    return count;
}
public void setCount(int count) {
    this.count = count;
}

public ListTestObject(String name, int count) {
    super();
    this.name = name;
    this.count = count;
}

@Override
public boolean equals(Object obj) {

    ListTestObject testObj;
    try {
        testObj = (ListTestObject) obj;
    } catch (Exception e) {
        //类不同,直接返回false
        return false;
    }
    if(testObj.getName().equals(this.getName())){
        return true;
    }
    return false;
}

@Override
public String toString() {
    return "ListTestObject [name=" + name + ", count=" + count + "]";
}

}

把他们放到一个map中,name做key,再拿出来,就可以了

说下我的思路:
1. List中的每个对象的类型中写Compare()方法(根据name字段判断对象是否相等)
2. 新建HashSet set, 将List中的每个对象加入到set中去

  • 如果重复,那么找到set中已经有的对象,将其count字段+1 *如果不重复,那么直接加入set
  • 将set转换为List类型返回 思路: 运用哈希表查找时间复杂度为O(1),但是这个这个方法空间复杂度是O(n),不知道符不符合你的应用条件。

有点像wordcount, 按name字段将表进行哈希,添加到hashmap中,若已存在就将count值加1。最后将hashmap中每一个元素加入到list中。

首先,抽象你的表对象为TableObject,有两个属性name和count,可以重写它的equal方法,以name属性为基础。
其次,就是编写合并算法,可以先定义一个空的列表,然后遍历原来的列表,往新的空列表里面添加,如果新列表中不存在该对象,则加入,否则就将对象的count加一。
实现如下:


public class TableObject {
    private String name;
    private int count;

    /**
     * @param name
     * @param count
     */
    public TableObject(String name, int count) {
        super();
        this.name = name;
        this.count = count;
    }

    public String getName() {
        return name;
    }

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

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        TableObject other = (TableObject) obj;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }

    @Override
    public String toString() {
        return "TableObject [name=" + name + ", count=" + count + "]";
    }

}

另一个合并 工具类如下:

 import java.util.ArrayList;
import java.util.List;

public class TableObjectMerge {
    public static List<TableObject> merge(List<TableObject> target){
        if(target==null||target.isEmpty()){
            return null;
        }

        List<TableObject> lastResult = new ArrayList<TableObject>(target.size());
        for(TableObject t:target){
            //重新过equal后,contains判断会以name为基础判断是否存在的
            if(lastResult.contains(t)){
                //找到目标列表中的对象,修正count
                TableObject old = findObjectInList(lastResult,t);

                //修正已经存在的对象的count值
                int count = old.getCount();
                old.setCount(count+1);
            }else{
                //没有就加入
                lastResult.add(t);
            }
        }
        return lastResult;

    }

    private static TableObject findObjectInList(List<TableObject> list,TableObject object){
        for(TableObject o:list){
            if(o.equals(object)){
                return o;
            }
        }
        return null;
    }

    public static void main(String[] args) {
        List<TableObject> target = new ArrayList<TableObject>(10);
        TableObject t1 = new TableObject("obj1",1);
        TableObject t2 = new TableObject("obj1",1);
        TableObject t3 = new TableObject("obj1",1);
        TableObject t4 = new TableObject("obj4",1);
        TableObject t5 = new TableObject("obj5",1);
        TableObject t6 = new TableObject("obj6",1);
        TableObject t7 = new TableObject("obj7",1);
        TableObject t8 = new TableObject("obj8",1);
        TableObject t9 = new TableObject("obj9",1);
        TableObject t10 = new TableObject("obj10",1);
        target.add(t1);
        target.add(t2);
        target.add(t3);
        target.add(t4);
        target.add(t5);
        target.add(t6);
        target.add(t7);
        target.add(t8);
        target.add(t9);
        target.add(t10);

        List<TableObject> merge = merge(target);
        for(TableObject m:merge){
            System.out.println(m);
        }
    }
}

测试结果:

 TableObject [name=obj1, count=3]
TableObject [name=obj4, count=1]
TableObject [name=obj5, count=1]
TableObject [name=obj6, count=1]
TableObject [name=obj7, count=1]
TableObject [name=obj8, count=1]
TableObject [name=obj9, count=1]
TableObject [name=obj10, count=1]

重点就是查找列表中已经存在的对象,然后修正它的count值的操作;判断列表中是否存在某个对象可以直接用contains只要指定比较依据的属性。
两个测试类都直接放在src目录下面就可以了,有问题及时联系。祝好。

public class ListTest {
public static void main(String[] args) {

//这是5个实体
String biao1 = "name,count,field2,field3,field4";
String biao2 = "name,count,field2,field3,field4";
String biao3 = "name,count,field2,field3,field4";
String biao4 = "name,count,field2,field3,field4";
String biao5 = "name,count,field2,field3,field4";

List<Object> list = new ArrayList<Object>();

list.add(biao1);
list.add(biao2);
list.add(biao3);
list.add(biao4);
list.add(biao5);

List<String> list1 = new ArrayList<String>();

for(int i=0;i<list.size();i++){
    list1.add(list.get(i).getName());   
}

for(int i=0;i<list1.size();i++){
    comParato(list1.get(i));
}

}

private static void comParato(String string) {
    if(biao1.getName().equals(string)){
        biao1.setCount(count++);
    }
}

}


怎么感觉就是遍历List,比较name,相同的就删除一个,另一个count+1.

1.在对象的类中重写equals()方法
2.从list中遍历出对象然后在将取出的对象存放到对象数组中去
3.在对象的数组中进行比较(写个嵌套for()循环逐一比较)如果对象相同的话,count++

逻辑就像大家说的,不赘述了。
集合变换类操作,用java8很适合。不妨参考以下代码,包治百病。


 import com.google.common.base.Objects;
import com.google.common.collect.Lists;

import java.util.Collection;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * Created by LIHAO845 on 2016-10-29.
 */
public class StreamTest {

    public static void main(String[] args) {
        List<A> list = Lists.newLinkedList();
        list.add(new A("hello", 1));
        list.add(new A("hello", 2));
        list.add(new A("world", 3));
        Collection<Optional<A>> result = list.stream().collect(Collectors.groupingBy(A::getName, Collectors.reducing(A::addCount))).values(); // 这一行,就能完成所有逻辑
        System.out.println(result);
    }

}

class A {
    String name;
    int count;
    A(String name, int count) {
        this.name = name;
        this.count = count;
    }
    public String getName() {
        return name;
    }
    public A addCount(A a) {
        count += a.count;
        return this;
    }
    @Override
    public String toString() {
        return Objects.toStringHelper(this)
                .add("name", name)
                .add("count", count)
                .toString();
    }
}

为啥不再查数据库的时候直接 根据name 分组查询呢 然后 count 出来就 搞定了 写这么长的类文件 好像挺费神的

http://bbs.csdn.net/topics/360048229