15

配列 arrayA = ["a", "b", "c", "d", "e", "f"] と別の配列 arrayB = ["a", "d", 「エ」]。

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

(記号や構文の不適切な使用をお許しください。私は、Oracle チュートリアルから Java を学ぼうとしている Ruby 初心者です。ありがとう!) 編集: 単語と引用符

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

私はこれがあなたが必要とすることをすると信じています。操作は O(1) であるため、Arrays.asList()効率的で計算コストがかからないため、余分な変換について心配する必要はありません。

于 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

Setを構築してから、2 番目の配列を使用してそれをarrayA呼び出すことをお勧めします。removeAll

質問に示されているように2つの配列がソートされている場合、配列を1回反復するだけで問題を解決できます。

于 2013-06-25T12:47:27.857 に答える
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 に答える
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 に答える