`
soul_fly
  • 浏览: 38659 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

求两个集合差的几种常见算法

阅读更多

有两个数组:
String[] arr01={"Andy","Bill","Cindy","Douglas","Felex","Green"};
String[] arr02={"Andy","Bill","Felex","Green","Gates"};
求存在于arr01而不存在于arr02的元素的集合?

 

最容易想到的解法-双重循环

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

/** 
 * 利用双重循环实现的筛选
 */
public class DoubleCycling{
    public static void main(String[] args){
        String[] arr01={"Andy","Bill","Cindy","Douglas","Felex","Green"};
        String[] arr02={"Andy","Bill","Felex","Green","Gates"};
        
        // 筛选过程,注意其中异常的用途
        List<String> ls=new ArrayList<String>();
        for(String str:arr01){
            try{
                ls.add(getNotExistStr(str,arr02));
            }
            catch(Exception ex){
                continue;
            }            
        }
        
        // 取得结果
        Object[] arr03=ls.toArray();
        for(Object str:arr03){
            System.out.println(str);
        }
    }
    
    /** 
     * 查找数组Arr中是否包含str,若包含抛出异常,否则将str返回
     * @param str
     * @param arr
     * @return
     * @throws Exception
     */
    public static String getNotExistStr(String str,String[] arr) throws Exception{
        for(String temp:arr){
            if(temp.equals(str)){
                throw new Exception("");
            }
        }
        
        return str;
    }
}

 

 

速度较高的解法-利用哈希表

 

import java.util.ArrayList;
import java.util.Collection;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;

/** 
 * 利用哈希表进行筛选
 */
public class HashtableFilter{
    public static void main(String[] args){
        String[] arr01={"Andy","Bill","Cindy","Douglas","Felex","Green"};
        String[] arr02={"Andy","Bill","Felex","Green","Gates"};
        
        
        Map<String,String> ht=new Hashtable<String,String>();
        
        // 將arr02所有元素放入ht
        for(String str:arr02){
            ht.put(str, str);
        }
        
        // 取得在ht中不存在的arr01中的元素
        List<String> ls=new ArrayList<String>();
        for(String str:arr01){
            if(ht.containsKey(str)==false){
                ls.add(str);
            }
        }
        
        // 取得结果
        Object[] arr03=ls.toArray();
        for(Object str:arr03){
            System.out.println(str);
        }
    }
}

 

 

最方便的解法-利用工具类

 

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

/** 
 * 使用工具类的筛选去除
 */
public class Tool{
    public static void main(String[] args){
        String[] arr01={"Andy","Bill","Cindy","Douglas","Felex","Green"};
        String[] arr02={"Andy","Bill","Felex","Green","Gates"};
        
        // 直接转的话,生成的List不支持removeAll
        List<String> ls01=new ArrayList<String>();
        for(String str:arr01){
            ls01.add(str);
        }
        
        // 同上
        List<String> ls02=new ArrayList<String>();
        for(String str:arr02){
            ls02.add(str);
        }
        
        // 去除arr01中存在于arr02中的元素
        ls01.removeAll(ls02);
        
        // 取得结果
        Object[] arr03=ls01.toArray();
        for(Object str:arr03){
            System.out.println(str);
        }
    }
}

 

利用二叉树的解法 

 

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

/** 
 * 使用二叉樹的筛选去除
 */
public class Test{
    public static void main(String[] args){
        String[] arr01={"Andy","Bill","Cindy","Douglas","Felex","Green"};
        String[] arr02={"Andy","Bill","Felex","Green","Gates"};
        
        // 以數組2為基礎創建二叉樹
        Tree tree=new Tree();        
        for(String str:arr02){
            tree.insert(str);
        }
        
        // 將在二叉樹中不存在的元素放入鏈錶
        List<String> ls=new ArrayList<String>();        
        for(String str:arr01){
            if(tree.find(str)==null){
                ls.add(str);
            }
        }
        
        // 輸出
        for(String str:ls){
            System.out.println(str);
        }
    }
}

 

 

当然还有其它的一些算法这次就不列举了。

分享到:
评论
1 楼 fanzy618 2009-06-18  
有个更简单的方法:

Set s = new HashSet(arr01);
s.removeAll(arr02);

制造轮子还是留给专业人士比较好。

相关推荐

    算法引论:一种创造性方法.[美]Udi Manber(带详细书签).pdf

    6.11.2 查找集合中两个最大的元素 6.11.3 计算多重集合的模 6.12 小结 第7章 图算法 7.1 引言 7.2 欧拉图 7.3 图的遍历 7.3.1 深度优先搜索 7.3.2 广度优先搜索 7.4 拓扑排序 7.5 单源最短路径 7.6 最小...

    粒子群优化算法源码下载

    对两种问题分别应用了不同的测试函数对其进行了测试,结果表明了粒子群优化算法求解最优化问题的可行性。第三、针对约束优化问题本文在引入了半可行域的概念的基础上提出了竞争选择的新规则,并改进了基于竞争选择和...

    C#数据结构

    我们可以对String进行求长度、复制、连接两个 字符串等操作。 数据类型可分为两类:一类是非结构的原子类型,如C#语言中的基本类型 (整型、实型、字符型等);另一类是结构类型,它的成分可以由多个结构类型 组成,...

    最新Java面试宝典pdf版

    55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 36 56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序...

    超级有影响力霸气的Java面试题大全文档

     异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获...

    Java面试宝典2010版

    55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。 ...

    Java面试笔试资料大全

    55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 36 56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序...

    java 面试题 总结

    异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的...

    Java面试宝典-经典

    55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 36 56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序...

    JAVA面试宝典2010

    55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 36 56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序...

    java面试题大全(2012版)

    55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 36 56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序...

    java面试宝典2012

    55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 40 56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序...

    Java面试宝典2012版

    55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 36 56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序...

    Java面试宝典2012新版

    55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 36 56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序...

    计算机二级C语言考试题预测

    (20) 数据库设计包括两个方面的设计内容,它们是(A) A. 概念设计和逻辑设计 B. 模式设计和内模式设计 C. 内模式设计和物理设计 D. 结构特性设计和行为特性设计 (21) 下列叙述中正确的是(A) A. 线性表是线性结构 B. ...

    leetcode2-Data-Structure-Algorithm-Programs:此Repo由数据结构和算法组成

    这些步骤的集合是算法,而数据结构是在解决该问题或构建任何软件期间存储和组织数据的一种方式,以便可以在时间和空间方面有效地使用它,这样数据结构和算法总是允许我们编写高效和优化的计算机程序。” STL是标准...

    java面试题

    84.3. 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题。 107 84.4. 现在输入n个数字,以逗号”,”分开;然后可选择升...

    JAVA面试题最全集

    76.EJB有哪几种?区别是什么? 77.JavaBean与EJB有什么区别? 78.软件开发生命周期有哪几个阶段? 79.软件开发有哪些因素? 80.软件开发中如何进行版本控制? 81.UML中,类视图如何表示类中的继承与聚合? 82.客户端...

Global site tag (gtag.js) - Google Analytics