Как вычесть один массив символов из другого в Java?

Скажем, у меня есть массив, arrayA = [ "a", "b", "c", "d", "e", "f" ], и другой массив, arrayB = [ "a", "d", "e" ].

Я хочу вычесть arrayB из arrayA, чтобы получить результат = [ "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 noob, пытающийся изучить Java просто из учебников Oracle. Спасибо!) edit: слово и кавычки

Ответы

Ответ 1

Короткий ответ состоит в том, чтобы преобразовать ваши массивы в "наборы", а затем использовать для них заданные операции. Я ищу правильный код для этого прямо сейчас, но вы можете начать с проверки этого сообщения: Операции с классическим набором для 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), поэтому она эффективна и не является дорогостоящей вычислительной, поэтому не беспокойтесь об этом дополнительном преобразовании.

Ответ 2

Преобразуйте их в список и вызовите метод 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);`

Ответ 3

Я предлагаю вам построить Set из arrayA, а затем вызвать removeAll на нем, используя второй массив.

Если два массива отсортированы, как показано в вашем вопросе, вы можете решить проблему с помощью одной итерации по массивам.

Ответ 4

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);
    }
}
}

Ответ 5

Arrays.asList не работает с примитивными типами, такими как char, поэтому вам нужно выполнить итерацию по обеим массивам, изменить их на класс класса-символа и добавить их к наборам. Затем вы можете использовать метод 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();
}

Ответ 6

Преобразуйте свои массивы в списки (например, ArrayList) с помощью Arrays.asList(). Общие наборы не принимают примитивные типы (так какList не будет работать на ваших массивах, как они есть сейчас), поэтому вы можете использовать объект 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

Если вам нужны массивы, вы можете использовать функцию arArray() ArrayList для воссоздания массива.