2015-10-22 2 views
-1

Итак, я создал массив с несколькими дубликатами, и я создал алгоритм, который будет определять дубликаты и изменить значение на 0. После того, как я изменил значение на 0, он найдет все значения в 0 и переопределить их.Удалить дублирующий алгоритм

for(out = 0;out < array.length - 1;out++) 
     for(in = out+1; in < index;in ++) 
      if(array[in] == array[out]) 
       array[in] = 0; 
    for(int n = 0;n < array.length;n++) 
     if(array[n] == 0){ 
      array[n] = array[n + 1]; 
      n--; 

Однако это, кажется, не работает, и когда я действительно сделать несколько настроек, чтобы заставить его работать, это не отменяет элементы и уменьшить размер массива, ничего я делаю не так?

Благодаря

+0

Я хотел бы предложить отрываясь термином 'recursive' функции. Рекурсии следует избегать, как чуму, но в вашем случае это может помочь. –

+0

Какова ваша цель для этого? – chrylis

+0

Да. У вас нет фигурных скобок. – UmNyobe

ответ

2

Вы должны фигурные скобки ({ и }). Без них вы выполняете только следующую строку, но потом ничего больше.

Например:

if(x == y) 
    y = 1; 
    System.out.println("Not inside if"); 

Только y = 1 будет выполняться в результате x == y возвращения true. System.out.println("Not inside if") всегда будет выполняться, потому что он находится вне условного оператора if.

Если вы хотите, чтобы обе линии работать только при x == y, вы можете сделать следующее:

if(x == y) { 
    y = 1; 
    System.out.println("Not inside if"); 
} 
+0

Это не похоже на фигурные скобки. Отсутствие брекетов в порядке (за исключением отсутствующей закрывающей скобки в конце). Не очень читаемый, но правовой java. –

2

Ваш алгоритм должен быть два прохода. Прежде всего, отметить все дубликаты с нулевым

for(out = 0;out < array.length - 1;out++) 
    for(in = out+1; in < index;in ++) 
     if(array[in] == array[out]) 
      array[in] = 0; 

Затем вычислить, что нужно ставить на отмеченных позициях и переопределить их.

   for(int i = 0;i < array.length;i++) 
        if(array[i] == 0) 
         array[i] = newvalue(i);// array[i + 1]; 
0

Итак, вы пытаетесь удалить элементы из существующего массива. Вы не можете этого сделать. Вместо этого вам нужно создать новый массив и заполнить его только теми элементами, которые вы хотите сохранить.

Один гладкий способ сделать это с помощью ArrayList. Это позволит вам удалить дубликаты за один проход.

ArrayList<Integer> myList = new ArrayList<>(Arrays.asList(array)); 
for (int out = 0; out < array.length; out++) { 
    for (int in = out + 1; in < array.length; in++) { 
     if (array[in] == array[out]) { 
      myList.remove(in); 
      in--; 
     } 
    } 
} 

Или, в чисто массиве духе оригинала:

int newLength = array.length; 
for(int out = 0; out < array.length; out++) { 
    for(int in = out + 1; in < array.length; in++) { 
     if (array[in] == array[out]) { 
      array[in] = 0; 
      newLength--; 
     } 
    } 
} 

int[] newArray = new int[newLength]; 
int i = 0; 
for(int n = 0; n < array.length; n++) { 
    if (array[n] != 0) { 
     newArray[i] = array[n]; 
     i++; 
    } 
} 
Смежные вопросы