如何找到两个字符串数组的联合

时间:2013-10-16 03:40:56

标签: java arrays

我试图找到两个字符串数组的并集。我创建了一个新数组,并将第一组中的所有数据复制到新数组中。我无法将第二组中的信息添加到新数组中。

我需要使用循环来搜索第二个数组并找到重复项。我一直在ArrayIndexOutOfBoundsException

这是我目前的代码:

static String[] union(String[] set1, String[] set2) {
    String union[] = new String[set1.length + set2.length];

    int i = 0;
    int cnt = 0;

    for (int n = 0; n < set1.length; n++) {
        union[i] = set1[i];
        i++;
        cnt++;
    }

    for (int m = 0; m < set2.length; m++) {
        for (int p = 0; p < union.length; p++) {
            if (set2[m] != union[p]) {
                union[i] = set2[m];
                i++;
            }
        }
    }
    cnt++;

    union = downSize(union, cnt);

    return union;
}

5 个答案:

答案 0 :(得分:7)

做交叉口或联合的标准方法是使用一套。您应该使用集合框架中的Set类。

为两个阵列创建两个arraylist对象  定义一个Set对象  使用addAll方法将两个arraylist对象添加到Set中。

由于set包含唯一元素,因此该集合形成了联合     两个阵列。

  //push the arrays in the list.
  List<String> list1 = new ArrayList<String>(Arrays.asList(stringArray1));
  List<String> list2 = new ArrayList<String>(Arrays.asList(stringArray2));

  HashSet <String> set = new HashSet <String>();

  //add the lists in the set.
  set.addAll(list1);
  set.addAll(list2);

  //convert it back to array.
  String[] unionArray = set.toArray(new String[0]);       

答案 1 :(得分:4)

使用Set将是最简单的方法之一:

public static String[] unionOf(String[] strArr1, String[] strArr2) {
    Set<String> result = new HashSet<String>();
    result.addAll(Arrays.asList(strArr1));
    result.addAll(Arrays.asList(strArr2));
    return result.toArray(new String[result.size()]);
}

还有其他实用程序可以帮助进行类似的工作,例如番石榴:

public static String[] unionOf(String[] strArr1, String[] strArr2) {
    return Sets.union(Sets.newHashSet(strArr1), 
                      Sets.newHashSet(strArr2))
               .toArray(new String[0]);
}

答案 2 :(得分:3)

这部分代码存在一些问题:

for(int m = 0; m < set2.length; m++)
        for(int p = 0; p < union.length; p++)
            if(set2[m] != union[p])
            {   
                union[i] = set2[m];
                i++;        
            }
        cnt++;

首先,您应该使用!equals()代替!=来比较字符串。其次,尽管有缩进,但语句cnt++不是外循环的一部分。您不需要icnt;他们的价值应始终匹配。最后,您为set2[m]的每个与其不同的元素添加union一次。您只想添加一次。这是一个应该有效的版本:

static String[] union( String[] set1, String[] set2 )
{
    String union[] = new String[set1.length + set2.length];
    System.arraycopy(set1, 0, union, 0, set1.length); // faster than a loop
    int cnt = set1.length;
    for(int m = 0; m < set2.length; m++) {
        boolean found = false;
        for(int p = 0; p < union.length && !found; p++) {
            found = set2[m].equals(union[p]);
        }
        if(!found)
        {   
            union[cnt] = set2[m];
            cnt++;        
        }
    }
    union = downSize( union, cnt );
    return union;
}

正如其他海报所指出的,另一种方法是使用HashSet<String>,添加在两个数组中找到的元素,然后将结果转换回数组。

答案 3 :(得分:0)

你在这一行得到ArrayIndexOutOfBoundsException:

union[i] = set2[m];

因为你在i次(嵌套循环)附近不断增加set2.length * union.length

做RJ写的内容不会给你工会 - 你会有很多重复的项目,因为:set2[m].equals(union[p])你将set2的每个成员与union的所有成员进行比较,为每个成员进行比较成员,它不等于 - 你添加它。所以你最终多次添加相同的项目!

正确的方法就像Deepak Mishra使用Set建议的那样,这将照顾&#34;照顾&#34;重复。

示例:

int[] a = {1,2,3,4,5};
int[] b = {4,5,6,7};
Set union = new HashSet<Integer>();
for(int i=0; i<a.length; i++) union.add(a[i]);
for(int i=0; i<b.length; i++) union.add(b[i]);
Object[] ans = union.toArray();
for(int i=0; i<ans.length; i++)
    System.out.print(ans[i]+" ");

将输出:

1 2 3 4 5 6 7 

由于它的硬件我不会写答案的代码,但我会给你一个提示:按你的方式做你需要O(n^2) - 如果你会想一想,我确信你可以在更好的时间找到办法,比如,O(n log n) ......

答案 4 :(得分:0)

尽管使用SETS是最佳解决方案,但这是一个简单的解决方案。

 private static String getUnion(String a, String b, boolean ignoreCase) {

    String union = "";

    if (a == null || b == null || a.length() < 1 || b.length() < 1) {
        return union;
    }

    char[] shortest;
    char[] longest;

    if (ignoreCase) {
        shortest = (a.length() <= b.length() ? a : b).toLowerCase().toCharArray();
        longest = (a.length() <= b.length() ? b : a).toLowerCase().toCharArray();
    } else {
        shortest = (a.length() <= b.length() ? a : b).toLowerCase().toCharArray();
        longest = (a.length() <= b.length() ? b : a).toLowerCase().toCharArray();
    }

    StringBuilder sb = new StringBuilder();

    for (char c : shortest) {
        for (int i = 0; i < longest.length; i++) {
            if (longest[i] == c) {
                sb.append(c);
            }
        }
    }

    union = sb.toString();

    return union;
}

以下几项测试。

public static void main(String[] args) {

    System.out.println("Union of '' and BXYZA is " + getUnion("", "BXYZA", true));
    System.out.println("Union of null and BXYZA is " + getUnion(null, "BXYZA", true));

    System.out.println("Union of ABC and BXYZA is " + getUnion("ABC", "BXYZA", true));
    System.out.println("Union of ABC and BXYZA is " + getUnion("ABC", "bXYZA", false));

}