日期:2014-05-17  浏览次数:20869 次

求教一个关于两个list的类似求并集的算法。。。
两个list,里面都存的是String[]
list1
0 -{张三,3}
1 -{李四,16}
2 -{王五,6}
3 -{二麻子,8}




list2
0 -{李四,3}
1 -{二麻子,4}
2 -{刘德华,8}




求得并集
list
0 -{张三,3}
1 -{李四,19}
2 -{王五,6}
3 -{二麻子,10}
4 -{刘德华,8}
..
.
大概就是String[0]求并,同时String[1]求和

我写了一个感觉很麻烦。。。不知道有没有简单的算法。。。。


------解决方案--------------------
list1.addAll(list2);
------解决方案--------------------
你list里面的数据时不能重复的? 那就用set。 然后set1.addAll(set2)

------解决方案--------------------
Java code
import java.util.ArrayList;
import java.util.List;

class Main {
    /*
     * {张三,3} {李四,16} {王五,6} {二麻子,8}
     * 
     * {李四,3} {二麻子,4} {刘德华,8}
     */

    /*
     * 0 -{张三,3} 1 -{李四,19} 2 -{王五,6} 3 -{二麻子,10} 4 -{刘德华,8}
     */
    public static void main(String args[]) {
        List<String[]> list1 = new ArrayList<String[]>();
        List<String[]> list2 = new ArrayList<String[]>();

        list1.add(new String[] { "张三", "3" });
        list1.add(new String[] { "李四", "16" });
        list1.add(new String[] { "王五", "6" });
        list1.add(new String[] { "二麻子", "8" });

        list2.add(new String[] { "李四", "3" });
        list2.add(new String[] { "二麻子", "4" });
        list2.add(new String[] { "刘德华", "8" });

        List<String[]> r = add(list1, list2);
        for (String[] arg : r)
            System.out.println(arg[0] + " " + arg[1]);
    }

    private static List<String[]> add(final List<String[]> arg0,
            final List<String[]> arg1) {

        List<String[]> result = new ArrayList<String[]>();

        for (int i = 0; i < arg0.size(); i++) {
            // 标记arg0.get(i).[0] 和
            // arg1.get(j).[0] 是否一样
            boolean flag = false;

            for (int j = 0; j < arg1.size(); j++) {
                // 判断String[0] 是否一样
                if (arg0.get(i)[0].equals(arg1.get(j)[0])) {
                    flag = true;
                    // String[1]加法
                    int temp = Integer.parseInt(arg0.get(i)[1])
                            + Integer.parseInt(arg1.get(j)[1]);
                    // 以arg0 为标准 ,放入结果中
                    result.add(new String[] { arg0.get(i)[0],
                            String.valueOf(temp) });
                    // 去掉 arg1中String[0]相同的元素
                    arg1.remove(j);
                    break;            // 这一句增加效率而已
                }
            }
            // 如果 arg0.get(i).[0] 和 arg1.get(j).[0] 一样 避免重复添加
            if (!flag)
                result.add(arg0.get(i));
        }
        // 判断arg1 中是否还有剩余
        if (arg1.size() > 0)
            result.addAll(arg1);
        return result;

    }
}

------解决方案--------------------
探讨

Java code

for (int j = 0; j < arg1.size(); j++) {
arg1.remove(j);//而且你的这个有问题啊。。。循环里面remove....而且没有j--..... }

------解决方案--------------------
新建一个list,然后用两个for循环,外层for循环用list1,内层循环用list2,外层循环每取一个就和内层中的每一个元素去比较,先比较String[0],如果相同就把两个string[1]相加,内层循环结束后,把这个新的string[]写入新建的list中去。如此循环就ok了,至于细节,自己去写代码吧
------解决方案--------------------
具体代码, 我想上面已经给出思路了.

此处我想对你说的事, for(int i=0 ; i< list.size();i++)
这里的list.size() 确实是很耗性能的。应为你每一次都回去计算list的大小。
for(int i=0,j=list.size();i<j;i++) 这样效率提高不少!!!