0 0

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

有两个数组:
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);
        }
    }
}

 

 

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

2009年6月18日 13:07

3个答案 按时间排序 按投票排序

0 0

朋友,问题要自动关闭啦,结分哦

2009年6月29日 08:14
0 0

楼上的
楼主不是有 最方便的解法-利用工具类 么

楼主只是讨论下算法 没必要上升到轮子这个高度吧

再算轮子再多 也不一定就有合适自己的 

2009年6月18日 21:56
0 0

有个更简单的方法:

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

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

2009年6月18日 13:07

相关推荐

    取两个集合的交集

    计算两个集合的交集可以采用多种方法,下面介绍几种常见的算法: - **双循环法**:这种方法是最直观的,但效率较低。它的基本思路是遍历第一个集合中的每个元素,并检查该元素是否也存在于第二个集合中。如果存在,...

    几种常见的图论算法详解

    在本文中,我们将深入探讨几种常见的图论算法,包括最小生成树、最短路径、有向图的强连通分量以及二部图。 首先,最小生成树算法用于寻找一个无向图中连接所有顶点的边的集合,使得这些边的权重之和最小。两种常用...

    集合幂级数的性质与应用及其快速算法

    例如,两个集合的并集对应于级数中的加法,而两个集合的交集则可以类比于乘法。这些集合运算的性质,如交换律、结合律、分配律等,为集合幂级数的性质提供了基础。 在研究集合幂级数的性质时,文章提到了三种常见的...

    几种常用算法的C语言实现

    本文将详细介绍四种常见的算法——折半插入、二叉搜索树、直接插入以及折半查找,并提供它们的C语言实现。理解并熟练掌握这些算法对于提升编程技能和优化代码效率至关重要。 1. **折半插入**(Binary Insertion ...

    用Java实现几种常见的排序算法

    它将数组分为两半,分别对每一半进行排序,然后合并这两个已排序的子数组。 ```java package org.rut.util.algorithm.support; import org.rut.util.algorithm.SortUtil; public class MergeSort implements ...

    常见的几种算法介绍!

    本文将深入探讨几种常见的算法,包括排序、搜索、图论和动态规划等,并附带相关的代码示例,帮助你更好地理解和应用这些算法。 首先,我们来谈谈排序算法。排序是将一组数据按特定顺序排列的过程。其中,冒泡排序是...

    几种常见算法的介绍及复杂度分析.pdf

    在计算机科学中,算法是解决问题或执行任务的具体步骤集合。它们是程序设计的核心,用于解决各种计算问题。本文件主要探讨的是排序算法,这是数据处理和计算机科学中最基本也是最重要的部分。 【稳定与非稳定排序】...

    常见的几种页面算法以及应用

    本篇将详细探讨几种常见的页面算法及其应用。 1. **最佳置换算法(Optimal Page Replacement Algorithm)** 最佳置换算法是一种理想化的页面替换策略,它总是能预测未来哪一页会被最早使用,然后选择最长时间不会...

    基于遥感影像分析,进行分类识别,进行变化检测几种算法集合包

    "基于遥感影像分析,进行分类识别,进行变化检测几种算法集合包" 提供了一个综合的资源,旨在帮助用户理解和应用相关算法。这个集合包包含了CRCPython-master,可能是一个包含Python实现的遥感影像处理库。 遥感...

    2_链表_求la和lb的交集_

    在计算机科学中,链表是一种常见的数据结构,用于存储一系列有序的数据元素。在这个问题中,我们面临的是一个特殊的链表操作:寻找两个已排序的单链表LA和LB的交集,并将结果以同样有序的单链表C的形式返回。这个...

    JAVA排序算法集合

    以上介绍了Java排序算法中常见的几种方法及其变体。每种算法都有其特点和适用场景,例如当数据量较小时可以选择直接插入排序或直接选择排序;当数据量较大时,归并排序和快速排序则更为合适。理解这些算法的工作原理...

    两个list比较 取不同的对象

    ### 两个List比较取不同的对象 在Java编程中,经常需要对两个`List`进行比较,找出它们之间的差异。这通常涉及到数据结构的理解、算法设计以及编程实现等多个方面。本文将详细探讨如何通过一个示例代码来理解如何...

    C# 文本对比算法比较两个字符串的不同

    一种常见的算法是Levenshtein距离,它计算了将一个字符串转换为另一个字符串所需的最少单字符编辑次数。其他算法,如Longest Common Subsequence(最长公共子序列)和Diff Match Patch,也能提供类似的功能。 2. **...

    两个多边形的并交差

    在计算机图形学中,多边形的并集、交集和差集操作是常见的几何算法,主要用于图形处理、碰撞检测、图像分析等领域。本话题主要探讨如何计算两个简单多边形(可以是凸多边形或凹多边形)的并集、交集和差集。 首先,...

    常见算法介绍详解.pdf

    下面将详细介绍几种常见的排序算法。 1. **插入排序** - **直接插入排序**:该算法的基本思想是将一个新的数据插入到已经排好序的数据列中。初始时,数组的第一个元素被认为是已排序的部分;然后,对于未排序的每...

    字符串相似度比较算法

    以下是几种常见的字符串相似度比较算法的详细解释: 1. **Levenshtein 距离**: Levenshtein 距离(也称为编辑距离)是衡量两个字符串之间最少单字符编辑操作(插入、删除、替换)次数的方法。例如,将 "kitten" ...

    排序算法集合

    以上就是"排序算法集合"中常见的几种排序方法,每种算法都有其独特的优势和局限性。在实际应用中,我们需要根据数据特点和性能需求选择合适的排序算法。例如,对于小规模数据或部分有序数据,插入排序可能更优;而...

    Java程序设计-常见算法

    本主题“Java程序设计-常见算法”主要涵盖查找算法和排序算法两个大类,下面将详细阐述这两个领域的基本概念、原理以及它们在Java中的实现。 首先,我们来讨论查找算法。查找算法的目标是在数据集合中找到特定元素...

    .net各种算法集合

    本文将详细介绍几种常见的排序算法,包括冒泡排序、快速排序和希尔排序。 **冒泡排序**是一种简单的排序算法,其基本思想是通过重复遍历待排序的数组,比较相邻元素并交换位置,使得较大的元素逐渐“浮”到数组的...

    常见算法介绍.docx

    本文将详细介绍几种常见的算法类型及其应用场景,包括排序算法、搜索算法、图算法以及动态规划算法。 #### 二、排序算法 排序算法是计算机科学中最基础也是最常用的算法之一。它主要负责对数据集合中的元素进行...

Global site tag (gtag.js) - Google Analytics