`
jianchen
  • 浏览: 342788 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java基础复习(16)-字符串数组交集,并集和差集

阅读更多

求两个字符串数组的交集,并集和差集的程序代码(有其他或更好的方法希望交流哈):

package string;

import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

public class StringArray {
    public static void main(String[] args) {
        //测试union
        String[] arr1 = {"abc", "df", "abc"};
        String[] arr2 = {"abc", "cc", "df", "d", "abc"};
        String[] result_union = union(arr1, arr2);
        System.out.println("求并集的结果如下:");
        for (String str : result_union) {
            System.out.println(str);
        }
        System.out.println("---------------------可爱的分割线------------------------");

        //测试insect
        String[] result_insect = intersect(arr1, arr2);
        System.out.println("求交集的结果如下:");
        for (String str : result_insect) {
            System.out.println(str);
        }

         System.out.println("---------------------疯狂的分割线------------------------");
          //测试minus
        String[] result_minus = minus(arr1, arr2);
        System.out.println("求差集的结果如下:");
        for (String str : result_minus) {
            System.out.println(str);
        }
    }

    //求两个字符串数组的并集,利用set的元素唯一性
    public static String[] union(String[] arr1, String[] arr2) {
        Set<String> set = new HashSet<String>();
        for (String str : arr1) {
            set.add(str);
        }
        for (String str : arr2) {
            set.add(str);
        }
        String[] result = {};
        return set.toArray(result);
    }

    //求两个数组的交集
    public static String[] intersect(String[] arr1, String[] arr2) {
        Map<String, Boolean> map = new HashMap<String, Boolean>();
        LinkedList<String> list = new LinkedList<String>();
        for (String str : arr1) {
            if (!map.containsKey(str)) {
                map.put(str, Boolean.FALSE);
            }
        }
        for (String str : arr2) {
            if (map.containsKey(str)) {
                map.put(str, Boolean.TRUE);
            }
        }

        for (Entry<String, Boolean> e : map.entrySet()) {
            if (e.getValue().equals(Boolean.TRUE)) {
                list.add(e.getKey());
            }
        }

        String[] result = {};
        return list.toArray(result);
    }

    //求两个数组的差集
    public static String[] minus(String[] arr1, String[] arr2) {
        LinkedList<String> list = new LinkedList<String>();
        LinkedList<String> history = new LinkedList<String>();
        String[] longerArr = arr1;
        String[] shorterArr = arr2;
        //找出较长的数组来减较短的数组
        if (arr1.length > arr2.length) {
            longerArr = arr2;
            shorterArr = arr1;
        }
        for (String str : longerArr) {
            if (!list.contains(str)) {
                list.add(str);
            }
        }
        for (String str : shorterArr) {
            if (list.contains(str)) {
                history.add(str);
                list.remove(str);
            } else {
                if (!history.contains(str)) {
                    list.add(str);
                }
            }
        }

        String[] result = {};
        return list.toArray(result);
    }
}
 

程序运行,打印输出:

求并集的结果如下:
d
abc
df
cc
---------------------可爱的分割线------------------------
求交集的结果如下:
abc
df
---------------------疯狂的分割线------------------------
求差集的结果如下:
cc
d

分享到:
评论
2 楼 kping 2010-09-02  
还有个地方改下
        for (String str : arr2) {
            if (map.containsKey(str)) {
                map.put(str, Boolean.TRUE);
            }
            else map.put(str, Boolean.FALSE);
        }
不用在写个方法那么麻烦。
1 楼 kping 2010-09-02  
为什么在求差集的时候,不在求并集的加
LinkedList<String> list1 = new LinkedList<String>();   
for (Entry<String, Boolean> e : map.entrySet()) {   
            if (e.getValue().equals(Boolean.FALSE)) {   
                list1.add(e.getKey());   
            }   
        }   

相关推荐

Global site tag (gtag.js) - Google Analytics