2016-11-26 80 views
0

所以我想比較兩個字符數組,而存在於KEYW所有的字母,應該從陣列invAlphabet被刪除。我已經能夠找到invAlphabet陣列內的重複,但是,我不知道如何刪除重複的元素,而無需使用列表或集合,我不應該使用... 任何想法?比較兩個數組和原數組的Java刪除重複(沒有列出)

public static void main(String[] args) 
{ 
    final int SIZE = 26; 
    char[] keyW = {'A', 'L','O'}; 

    char[] invAlphabet = new char [SIZE]; 


    for (int i = 0; i < SIZE; i++) 
    { 
     invAlphabet[i] = (char)('Z' - i); 

    } 



    for (int i = 0; i<keyW.length; i++) 
    { 
     for (int j = 0; j < invAlphabet.length; j++) 
     { 
      if(keyW[i] == invAlphabet[j]) 
      { 
       //need to delete the invAlphabet[j] elements that are duplicates 
       System.out.println(invAlphabet[j]); 
       System.out.println(j); 
       break; 

      } 

     } 
    } 

} 
+2

你是什麼意思的「刪除」在數組的上下文中 - 你不能調整數組的大小。你的意思是創建一個只包含特定元素的新數組嗎?你需要維護訂購嗎? –

+0

(如果你並不需要保存排序,這兩個數組排序,只是遍歷它們,尋找共同的要素)。 –

+0

@AndyTurner是的。我想創建一個新的invAlphabet,但沒有keyW數組中存在的元素。 invAlphabet是一個排序數組,其中包含倒序的字母(Z-A)。因此,在取出A,L和O字母后,新的invAlphabet數組應該按照Z-B的順序存在,而不存在A,L或O。 – user3768997

回答

1

如果你想解決它在O(n),就可以標記所有存在於keyW[]陣列的字符,然後檢查,並且不要將它們添加到您的新noDuplicateArray[]

char[] keyW = {'A', 'L', 'O', 'P'}; 
char[] invAlphabet = {'X', 'A', 'P', 'B', 'C'}; 

//create boolean array 
boolean[] mark = new boolean[128]; 
Arrays.fill(mark, false); 

//mark which characters are present in keyW array 
for (char ch : keyW) { 
    mark[ch] = true; 
} 

// find number of duplicate character in invAlphabet array 
int duplicateCount = 0; 
for (char ch : invAlphabet) { 
    if (mark[ch]) { 
     duplicateCount++; 
    } 
} 

// create new array 
// size of new array = invAlphabet array length - duplicate number of character in invAlphabet array 
char[] noDuplicateArray = new char[invAlphabet.length - duplicateCount]; 

//add character in new array 
int idx = 0; 
for (char ch : invAlphabet) { 
    if (!mark[ch]) { 
     noDuplicateArray[idx++] = ch; 
    } 
} 
+0

不錯的解決方案,O(n)! – user6904265

0

我將通過編寫一個方法來搜索一個char[]對於給定的char開始(即,contains法)等

private static boolean contains(char[] chars, char ch) { 
    for (char c : chars) { 
     if (c == ch) { 
      return true; 
     } 
    } 
    return false; 
} 

那麼問題可能是分解爲兩個步驟。首先,計算重複項,然後通過複製而不重複構建輸出數組。像

int dupes = 0; 
for (char ch : invAlphabet) { 
    if (contains(keyW, ch)) { 
     dupes++; 
    } 
} 
int i = 0; 
char[] noDupes = new char[invAlphabet.length - dupes]; 
for (char ch : invAlphabet) { 
    if (!contains(keyW, ch)) { 
     noDupes[i] = ch; 
     i++; 
    } 
} 

或者的東西,你可以在你的keyW陣列轉換爲String。而且,在Java 8+中,您可以構建角色的Stream。映射到陣列,過濾器對String,然後收集到另一個String。類似的,

String keyWord = new String(keyW); 
char[] noDupes = IntStream.range(0, invAlphabet.length) 
     .mapToObj(x -> invAlphabet[x]) 
     .filter(ch -> (keyWord.indexOf(ch) < 0)) 
     .map(String::valueOf) 
     .collect(Collectors.joining()).toCharArray(); 
0

您不能調整數組對象的大小,因爲您看到可以使用其他數據類型。但是,如果允許您僅使用數組,則可以將其他非字母字符替換爲刪除的字符。例如'0'。因此,在使用或打印時,如果數組爲'0',則可以跳過數組中的字符。

0

你能使用Stringreplace方法?

String invAlphabetString = new String(invAlphabet); 
for(char i:keyW){ 
    invAlphabetString=invAlphabetString.replace(""+i, ""); 
} 
char[] invAlphabetWithoutKeyW = invAlphabetString.toCharArray(); 
System.out.println(Arrays.toString(invAlphabetWithoutKeyW));