假如有一个ArrayList,或者Array里边有几组数据,都是字符串形式存放的。
例如:11,22,“”,22,“”,33,“”,11,44
最后得到一个al或者array是:
11,22,33,44具体的要求是:
获得第一个对象时,然后开始找,后边是否有相同的对象。如果后边存在相同的对象,那么后边相同的的对象,替换前边相同的对象,这样反复。如果对象是null或者“”,不要。本来我想了几个方法,但是都有缺陷。
现在脑子绕不过来了,请大家也想想。一句话就是,同样是相同的对象,最后一个会最终把前边一样的都替换掉,只留最后这一个对象。

解决方案 »

  1.   


    List<String> list = new ArrayList<String>();
    list.add("11");
    list.add("22");
    list.add("");
    list.add("22");
    list.add("");
    list.add("33");
    list.add("");
    list.add("11");
    list.add("44"); List<String> result = new ArrayList<String>();

    while(list.size() > 0) {
    String s = list.remove(0); if(s != null && !"".equals(s) && !list.contains(s)) {
    result.add(s);
    }
    } System.err.println(java.util.Arrays.toString(result.toArray()));
      

  2.   

    可能是我没解释清楚吧。要有过程去实现,而不是结果,不然数据就都错了。我举个直观的例子():假如数据库中有张表,表的键值有1,2,3。我现在有个arrayList,里边有也许相同的1,2,3,空,这样的多个重复对象,还有别的。那么比较开始,循环AL里边数据比较主键,如果AL中值一样,就更新一下表。AL里有空,就继续下一个比较。因为要这样的顺序来实现,不能单一的判断是否相同。这样,到最后,也就是说,AL里边最后一条和主键一样的对象,就把表里边的主键给替换掉了(相同的对象,后边的把前边的替换掉,一步一步来)。不知道我说的能否被大家理解。
      

  3.   

    list.add("11");
            list.add("22");
            list.add("");
            list.add("22");
            list.add("");
            list.add("33");
            list.add("");
            list.add("11");
            list.add("44");
    拿这个举例也行。我想要的过程是,取出第一个对象,后边开始比较。如果后边有空的,就直接去掉。如果有一样的,就把这个第一个对象替换掉,替换之后,这个对象也删除。这样下来,到最后,就只有不一样的对象存在了。
      

  4.   

    List<String> list1 = new ArrayList<String>();
    list1.add("11");
    list1.add("22");
    list1.add("33");
    list1.add("55");List<String> list2 = new ArrayList<String>();
    list2.add("22");
    list2.add("33");
    list2.add("66");for (String s : list2)
    {
    if (list1.contains(s))
    list1.remove(s);
    }for (String s : list1)
    {
    System.out.println(s);
    }
      

  5.   

    额~~不好意思。两个数组或者AL也可以比,但是应该是一样的2个比较。因为我要操作的数组或者是AL,只有一个。呵呵,谢谢2位~~还是想不透这个问题该怎样解决。
      

  6.   

    这个应该符合你的需求了。List<String> list = new ArrayList<String>();
    list.add("11");
    list.add("22");
    list.add("");
    list.add("22");
    list.add("");
    list.add("33");
    list.add("");
    list.add("11");
    list.add("44");List<String> listRst = new ArrayList<String>();
    for (String s : list) {
    if (!listRst.contains(s) && !s.equals(""))
    listRst.add(s);
    }
    for (String s : listRst) {
    System.out.println(s);
    }
      

  7.   


    1.遍历ArrayList表,找出有效的对象,取出这个对象的key
    2,去数据库寻找这个key
    3.如果找到,就更新它
    第二步,第三步其实可以用一条SQL语句了 update ... where  ...另外你没有提及这种情况,就是ArrayList存在有效对象,但是数据库却不存在。
    假如会出现这种情况,而你又想把它插入到数据库,第二第三步不能直接用一条sql语句了,
    你要根据Try..catch是否查询成功,决定是更新她还是插入它此外如果插入数据库的过程会严重影响效率时 你可以对ArrayList从后向前遍历,
    如果找到了已经遍历过的对象,那么你可以remove(Object o)它,,同时你可以剔除无效对象
    这里说起来轻松,但也要两重循环。
    所以你可以从前往后扫描ArrayList并把有效对象放入HashSet,只要你实现comparator, HashSet自动会吧相同的对象替换掉
    说到这里,又可以考虑一下,你以前的代码是否设计合理,反正最新对象都会取代旧对象,当初为什么不直接使用HashSet或LinkHashSet,而使用麻烦的ArrayList
      

  8.   

    那么比较开始,循环AL里边数据比较主键,如果AL中值一样,就更新一下表。AL里有空,就继续下一个比较。
    什么意思啊?
    那么开始比较:谁与谁比较?
    比较主键:哪来的主键?表中主键还用比较?根本不可能相同
    AL中值一样,就更新一下表:更新成什么样?
    最后一个问题 :AL到底是什么意思:ArrayList ?
      

  9.   

    哈哈,是我说的啰嗦。表达不清楚我的意思。事情是这样的:
    在页面有像数据库表的那样形式的输入。页面是有几行输入框,每行都有10多个输入值。最后存入到数据库。程序本来写的是存储过程,直接插入数据库。插入报错就用更新的方式来插入数据。因为每行某几个输入值,对应的是数据库表中的主键。所以,主键有重复的数据的话,那么插入肯定会出错。这样,就更新就行了。数据库中做的话,是比较容易的。当下条数据插入时,主键冲突,那么下条数据更新上一条冲突的数据就完了。但是现在我想拿到页面上来做,先用java端判定输入情况,这样能比在数据库中性能要高吧。所以在java端,就得实现一个逻辑(每一行的第一个输入项为主键):
    第一行和后边几行比较,依次进行判断。如果后一条的主键值和第一行的值一样,那么数据就应该是后边的这行,遇到后边有输入项为“”的,就不要这行数据。一直判断到最后,然后第二行的值开始继续往后比较。。依此类推,直到最后一个数据。就是只要有一样主键值的最后一条数据。所以,程序最后是,相同输入项的行数,只有一条(只拿每行输入的第一个值当主键就好了),输入项没值的,就不要。然后,这个时候,直接把所有的数据,就插入到数据库中就行了,都是唯一值。呵呵。就是这样。ps。1,AL是ArrayList。我这里说的主键,是把页面的某一项输入值说成是数据库中的主键,这样容易理解。
      

  10.   

    你说的真好呀,完全明白我的意思了。不太熟悉hashset,所以没用。这个问题不大,自己改就好了。我只是完全在java端做这个过程,我也是为了数据库性能的考虑。就是后边一条相同的数据,替换前边的一条,哈哈。最后有一样值的数据,只剩一条数据。空的数据,直接无视,去除。如果hashset实现,应该怎样实现?能否说下?
      

  11.   

    哪个比较好?hashset,hashmap?
    我现在用hashmap写出来了,不知道性能咋样。2个hashmap实现的。