2016-11-26 3 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

Не могли бы вы использовать String и replace метод?

String invAlphabetString = new String(invAlphabet); 
for(char i:keyW){ 
    invAlphabetString=invAlphabetString.replace(""+i, ""); 
} 
char[] invAlphabetWithoutKeyW = invAlphabetString.toCharArray(); 
System.out.println(Arrays.toString(invAlphabetWithoutKeyW)); 
Смежные вопросы