本帖最后由 adore_art 于 2011-12-18 00:07:45 编辑

解决方案 »

  1.   

    List<Integer> list=new ArrayList<Integer>();
    list.add(1);
    list.add(1);
    list.add(2);
    System.out.println(list.size());//输入3
    HashSet<Integer> h =new HashSet<Integer>(list);
    System.out.println(h.size());//输出2
      

  2.   


    List<Integer> list=new ArrayList<Integer>();
    list.add(1);
    list.add(1);
    list.add(2);
    System.out.println(list.size());//输入3
    HashSet<Integer> h =new HashSet<Integer>(list);
    System.out.println(h.size());//输出2
      

  3.   

    由于手机号码长度为11位,
    我觉得用Trie树(又称字典树)就能解决这个问题。
    http://blog.csdn.net/smcwwh/article/details/5744053
      

  4.   

    感谢你们的留言,之前的就说过了不用到set和map之类的API..
      

  5.   

    我并没有说用set/map的API来剔重,
    使用Trie树结构,插入操作最坏为N * 11(N=1000万),
    读取为M * 11(M为不重复的手机号码数量),并且读出的数据可以是排序好的。
    甚至你要统计出在这1000万个手机号码中,有重复的号码的重复次数都是轻而易举的。
      

  6.   

    构建这颗Trie树,需要的时间不短
      

  7.   

    楼主说尽量不用循环,我觉得不太现实吧,毕竟至少要循环一遍吧?
    1.trie树,建立好trie后就已经排重了。
    2.hash也是个不错的算法,可以用链表的方式处理冲突,如果发现hash值一样的话,你就查找下链表。冲突少得话,也是值得考虑的算法。
    3.bitmap算法也可以的。
      

  8.   

    public static void main(String[] args) {
    // TODO Auto-generated method stub
    ArrayList<String> al = new ArrayList<String>();
    al.add("a");
    al.add("a");
    al.add("a");
    al.add("b");
    al.add("a");
    al.add("a");
    al.add("c");
    al.add("b");
    for(int i = 0;i <al.size()-1;i++){
    if(al.get(i).hashCode() == al.get(i+1).hashCode())
    al.remove(i);
    }
    }
    只用了一层循环,不知可以不?
      

  9.   

    秒内是什么意思?
    1秒内?
    对于普通的堆表,数据库都没法在1s内完成千万级的数据去重
    最好是arraylist里的数据有序,这样就可以模拟聚簇表的方式处理
      

  10.   

    写了个Trie树,
    当数据量为100万时,大概2秒杀可以完成
    当数据量为1000万时,就悲剧了,内存和GC是颈瓶。
    惭愧
      

  11.   

    正在升级sdk  等下再回答你吧
      

  12.   

    字符串+ indexOf
    不知道性能如何,可以考虑按号段分成几个字符串,只要后面8位以提高效率.
      

  13.   

    感觉这个牛!应该可行,就是浪费空间--signature--------------------------
    http://www.purji.com/
      

  14.   

    凌晨的时候不小心睡着了  现在再过来看  发现做不出   感觉还是map好 读取速度快