15

假设我有一个数组,arrayA = [“a”,“b”,“c”,“d”,“e”,“f”],还有另一个数组,arrayB = [“a”,“d”, “e”]。

我想从 arrayA 中减去 arrayB 以产生结果 = ["b", "c", "f"]

这是我对每个数组的设置:

char[] arrayA = new char[7];
for(char c = 'a'; c <= 'f'; ++c) {
    arrayA[c - 'a'] = c;
}
char[] arrayB = new char[]{'a','d','e'};

(请原谅对符号和语法的任何不当使用,我是一个 Ruby 菜鸟,试图简单地从 Oracle 教程中学习 Java。谢谢!)编辑:一个词和引号

4

6 回答 6

24

简短的回答是将您的数组转换为“集合”,然后对它们使用集合操作。我现在正在寻找合适的代码,但您可以先查看这篇文章:java.util.Collection 的经典集合操作

编辑:Luke657 提出了一个很好的观点。原始数组很奇怪。所以下面是更新的代码:

假设您从一个 char 数组开始(当然最好从一个集合开始,但是哦,好吧):

char[] arrayA = new char[] {'a', 'b', 'c', 'd', 'e', 'f'};
char[] arrayB = new char[] {'a', 'd', 'e'};
Character[] objarrayA = ArrayUtils.toObject(arrayA);
Character[] objarrayB = ArrayUtils.toObject(arrayB);
Set<T> setA = new HashSet(Arrays.asList(objarrayA));
Set<T> setB = new HashSet(Arrays.asList(objarrayB));

setA.removeAll(setB);

然后,将其恢复为 char 数组:

Character[] result;
result = setA.toArray(result);
char[] cresult = ArrayUtils.toPrimitive(result);

我相信这会做你需要的。该Arrays.asList()操作是 O(1),因此高效且计算量不高,因此不必担心额外的转换。

于 2013-06-25T12:47:24.967 回答
12

将它们转换为 List 并调用removeAll方法:

Character[] array1 = ArrayUtils.toObject(arrayA);
    Character[] array2 = ArrayUtils.toObject(arrayB);       
    List<Character> list1 = new ArrayList(Arrays.asList(array1));
    List<Character> list2 = new ArrayList(Arrays.asList(array2));
    list1.removeAll(list2);`
于 2013-06-25T12:48:21.250 回答
7

我建议你构造一个SetarrayA然后removeAll使用第二个数组调用它。

如果两个数组的排序如您的问题所示,您可以通过对数组进行一次迭代来解决问题。

于 2013-06-25T12:47:27.857 回答
2

使用 . 将数组转换为列表(例如 ArrayList)Arrays.asList()。泛型集不采用原始类型(因此 asList 不会像现在这样在您的数组上工作),因此您可以像这样使用对象 Character :

Character a[] = {'f', 'x', 'l', 'b', 'y'};
Character b[] = {'x', 'b'};
ArrayList<Character> list1 = new ArrayList<Character>(Arrays.asList(a));
ArrayList<Character> list2 = new ArrayList<Character>(Arrays.asList(b));
list1.removeAll(list2);

如果您不熟悉泛型类型,请在此处阅读:http: //docs.oracle.com/javase/tutorial/java/generics/types.html

如果确实需要数组,可以使用 ArrayList 的 toArray() 函数重新创建数组。

于 2013-06-25T13:12:58.563 回答
2
import java.util.Collection;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Repeated {

public static void main(String[] args) {
//        Collection listOne = new ArrayList(Arrays.asList("a", "b", "c", "d", "e", "f"));
//        Collection listTwo = new ArrayList(Arrays.asList("a", "d", "e"));
 //
//        listOne.retainAll( listTwo );
//        System.out.println( listOne );

    String[] s1 = {"a", "b", "c", "d", "e", "f"};
    String[] s2 = {"a", "d", "e"};
    List<String> s1List = new ArrayList(Arrays.asList(s1));
    for (String s : s2) {
        if (s1List.contains(s)) {
            s1List.remove(s);
        } else {
            s1List.add(s);
        }
         System.out.println("intersect on " + s1List);
    }
}
}
于 2013-06-25T12:53:45.710 回答
2

Arrays.asList 不适用于 char 等原始类型,因此您必须遍历这两个数组,将它们更改为包装类 Character 并将它们添加到集合中。然后,您可以使用 removeAll 方法。

Set<Character> setA = new HashSet<>();
Set<Character> setB = new HashSet<>();
for(int i = 0; i < arrayA.length; i++){
    setA.add(new Character(arrayA[i]));
}
for(int i = 0; i < arrayB.length; i++){
    setA.add(new Character(arrayB[i]));
}
setA.removeAll(setB);
arrayA = new char[setA.size()];
int i = 0;
for(Character c : setA){
    arrayA[i++] = c.charValue();
}
于 2013-06-25T13:08:29.193 回答