Java 对 已有 List 的插入和修改操作

小杨阿哥哥 发布于 2011/08/23 14:30
阅读 19K+
收藏 0

现在有一个ArrayList list_a,里面保存有几百个JavaBean。

需要将另外一个ArrayList list_b 中具有和list_a中一样id的JavaBean替换到list_a中,并且保持原有的顺序,将list_b中type=add的JavaBean 插入到 list_a中指定的一个JavaBean 之后,并且将 list_b 中 type=disabled 的JavaBean 在list_a中找到与它具有相同id的JavaBean删掉

从两个ArrayList 开始,怎么样才能做到这些功能

加载中
0
鉴客
鉴客

相当于是两个列表的同步吧:)

如果不求什么高性能的话,遍历两次来完成这个功能不难的啊

Andre.Z
Andre.Z
所以我看不懂他的问题,哈哈哈~~
0
zhao_rong
zhao_rong

我觉得你描述的这个问题用TreeMap比较好哎。。

如果非要用ArrayList的话,那至少插入的时候保持有序就需要每次从小到大找到合适的位置了。。。

小杨阿哥哥
小杨阿哥哥
@zhao_rong : 好谢谢,我去试试
zhao_rong
zhao_rong
@杨焱 : 可以,不止一个办法,你可以查一下jdk文档,它最权威
小杨阿哥哥
小杨阿哥哥
@zhao_rong : 就是修改完全是基于一个现有的模板来做的修改,提交的只是做了修改的东西,在后台将修改后的东西融入到模板中,生成一个临时的新列表,功能就是这个。你说的那个TreeMap 好像真的能解决这个问题,如果实现了Comparator是不是,直接插进去就是按照那个方法来判断顺序的,那样就简单一些了。
zhao_rong
zhao_rong
@杨焱 : TreeMap是让Key按升序或者降序排序,你这种场景直接把你的javabean作为key就可以了,不过你的key需要实现equals方法来判断是不是同一个对象。 另外,你需要给TreeMap一个comparator的实现来判断两个对象之间谁大谁小。 我看你的问题好像是要从把一个容器中的对象合并到另一个中,而且要保持有序,所以我觉得TreeMap比较好用,不需要你自己找合适的位置了
小杨阿哥哥
小杨阿哥哥
TreeMap能够操作把一个东西加到一个之后或者之前吗?
0
scl33
scl33

首先, 必须保证这2个arraylist在对比操作时, 不会被其他线程操作, 避免并发.

其次, 如果同ID且只有type值不同的2个javabean通过equals方法比较不相等, 则需要改写javabean的equals方法, 使之相等.

最后, 有了以上条件, 一个for循环就搞定了.

for (JavaBean b:list_b){
  if ("add".equals(b.type) && !list_a.contains(b))
    list_a.add(b);
  else if ("disabled".equals(b.type) && list_a.contains(b))
    list_a.remove(b);
}

小杨阿哥哥
小杨阿哥哥
能不能做类似插入到某个之后的那种操作,由于提供的就是两个ARRAYLIST,所以要做什么动作只能从这个之后开始
0
scl33
scl33

引用来自“scl33”的答案

首先, 必须保证这2个arraylist在对比操作时, 不会被其他线程操作, 避免并发.

其次, 如果同ID且只有type值不同的2个javabean通过equals方法比较不相等, 则需要改写javabean的equals方法, 使之相等.

最后, 有了以上条件, 一个for循环就搞定了.

for (JavaBean b:list_b){
  if ("add".equals(b.type) && !list_a.contains(b))
    list_a.add(b);
  else if ("disabled".equals(b.type) && list_a.contains(b))
    list_a.remove(b);
}

可以啊, LIST可以自由的转换为Array, 同理也可以自由的转换为List

你看看Arrays这个工具类, 加上ArrayList本身的toArray方法, 可以方便的相互转化, 转成数组后, 就容易操作了吧? 操作完了再转为List.

如果你的list可以按ID排序就没这么麻烦了, 直接实现一个compareble接口, 或者删除插入完后转成数组后调用Arrays.sort重新排序一遍就完了.

for (JavaBean b:list_b){
  if ("add".equals(b.type) && !list_a.contains(b))
    list_a.add(b);
  else if ("disabled".equals(b.type) && list_a.contains(b))
    list_a.remove(b);
}

 

小杨阿哥哥
小杨阿哥哥
@scl33 : 我刚看了下,也看到这个方法了,嗯,确实是太强大了。有办法了,只要按照降序插入进去就不会影响之前的效果,理想状态是这样的,我先试试,谢谢你了,高手如云啊~
scl33
scl33
@杨焱 : list_a.add(10,javabean);直接插入指定位置...忘了这个了
小杨阿哥哥
小杨阿哥哥
有道理,不过我要给LIST的某些位置可能要插入或者去掉一些东西,不知道有什么好的方法。是不是treeMap更好一些。arrayList里面好像做这些修改不方便。
0
崔钢
崔钢
小心:java.util.ConcurrentModificationException。建议返回一个新的list。这样比较好。
小杨阿哥哥
小杨阿哥哥
嗯,是,差点忘记了,不能操作模板LIST,必须要COPY一个。细节细节
0
崔钢
崔钢
 static void work(List l1, List l2, List rs) {
        if (!l1.isEmpty()) {
            Object temp = l1.get(0);
            l1.remove(0);
            for (Object o : l2) {
                if (temp.equals(o)) {
                    //do some....
                    rs.add(o);
                }
            }
            work(l1,l2,rs);
        }
    }

返回顶部
顶部