Удаление повторяющихся символов в массиве String
У меня есть пример ввода, например, [q w e r r t], и я хочу удалить дубликаты и напечатать [q w e r t] с массивами. Я не понимаю, почему вывод отличается для приведенного ниже фрагмента кода.
for(int j=0; j< array.length; j++) {
for(int k=j+1; k< array.length; k++) {
if(array[j] == array[k]) {
continue;
}
System.out.print(array[j] + " ");
j = k;
}
}
Обновление: я хотел использовать эту логику для отсортированного массива. Я использовал Arrays.sort(). Я изменил == на.equals() для строк.
public static void main(String args[]) throws IOException {
// Enter size of array and assert the type of input
System.out.println("Enter size of array in integers");
Scanner sc = new Scanner(System.in);
while (!sc.hasNextInt()) {
System.out.println("Please enter integers");
sc.next();
}
;
// Accepting the values into the array and sorting them
int demoInt = sc.nextInt();
String[] array = new String[demoInt];
String[] outputMarkers = new String[demoInt];
System.out.println("Enter the values");
for (int i = 0; i < array.length; i++) {
Scanner scNum = new Scanner(System.in);
array[i] = scNum.next();
if (i == array.length - 1) System.out.println("Array is full");
}
Arrays.sort(array);
System.out.printf("Sorted array is : %s", Arrays.toString(array));
//Checking for duplicates //Sample: a a a s d f
for (int j = 0; j < array.length; j++) {
for (int k = j + 1; k < array.length; k++) {
if (array[j].equals(array[k])) {
continue; //returns to for loop with increment
}
System.out.print(array[j] + ". ");
j = k;
}
}
}
Вход: a a a d f Выход: a d f
4 ответа
Ваша проблема в том, что вы проверяете каждый символ против всех символов после него. Представьте себе массив без дубликатов; как только вы доберетесь до последнего символа, вы распечатаете все символы перед ним. Но когда j = array.length - 1
, затем k = array.length
и второй for
Цикл не запускается вообще, и ваш последний символ никогда не будет напечатан.
Ваш код всегда не сможет правильно распечатать последний элемент. Единственный случай, в котором это будет правильно, - это если ваш последний элемент является дубликатом предыдущего элемента, но не является вторым по последнему элементу.
Попробуйте этот код вместо этого:
outerloop:
for (int j = 0; j < array.length; j++) {
for(int k = 0; k < j; k++) {
if(array[j] == array[k]) {
continue outerloop;
}
}
System.out.print(array[j] + " ");
}
Предпосылка кода в том, что он проходит по каждому символу. Если он соответствует любому из предыдущих символов, код пропускает этот элемент и переходит к следующему.
РЕДАКТИРОВАТЬ: Похоже, вы редактировали вопрос для отсортированного массива вместо. Это означает, что если последний элемент является дубликатом, то перед ним будет дубликат элемента, поэтому нам не нужно беспокоиться о угловом регистре в моем предыдущем блоке кода.
for(int j=0; j< array.length; j++) {
for(int k=j+1; k< array.length; k++) {
if(array[j] == array[k]) {
continue;
}
System.out.print(array[j] + " ");
j = k;
}
}
System.out.print(array[array.length-1] + " ");
Если вы хотите удалить значения, а не просто пропустить их при печати, вы захотите начать с конца массива и перейти к 0, вызывая array.remove(i), когда вы найдете объект, который соответствует ранее проверенному объект.
Хотя это просто для того, чтобы сделать это как упражнение цикла. Было бы проще поместить ваш массив в набор.
Вы можете использовать логический массив размером 122, сделать все значения в массиве ложными, выполнить итерацию массива заданных символов, если значение символа ASCII равно ложному, тогда сделать его истинным и распечатать его. Ниже приведен пример кода, здесь я взял строку, удалив все дубликаты и распечатав полученную строку:
static String removeDuplicate(String s) {
boolean[] flagArr = new boolean[122];
int sLength = s.length();
StringBuilder resultStr = new StringBuilder();
for (int i = 0; i < sLength; i++) {
char tempChar = s.charAt(i);
int tempVal = (int) tempChar;
if (!flagArr[tempVal]) {
flagArr[tempVal] = true;
resultStr.append(tempChar);
}
}
return resultStr.toString();
}
Полный код на
Удаление повторяющихся символов из строки без использования Set | Блог Джайна Таруна
Почему бы не использовать только один цикл?
//assuming array has length >= 2
System.out.print(array[0] + " ");
for(int j=1; j< array.length; j++) {
if(array[j] == array[j - 1]) {
continue;
}
System.out.print(array[j] + " ");
}