2017-02-16 6 views
2

EDIT 3: это является причиной проблемы:Java массив сортировки (Что я делаю неправильно)

Для removeArrayElement (первая версия), его возвращение ToArray (новый пункт [0]), который выполняет нуль элемент в конце, но с новым методом он возвращает toArray (arr), который не выполняет нуль, но вы можете: создать массив типов типа T, т. е. новый T [0], так что это замена ? вместо «передавая массив снова», чтобы избавиться от нулевого элемента в конце

Старая проблема:

Я недавно обновлен, как я был массив сортировки путем создания одного главного метода обработки (с помощью орудий родовых типов) только метод aftermath дает мне массив ошибок за пределами границ.

Есть ли что-нибудь, что я пропустил?

Старые методы:

private static Item[] insertTabItem(Item[] a, int pos, Item item) { 
    Item[] result = new Item[a.length + 1]; 
    for(int i = 0; i < pos; i++) 
     result[i] = a[i]; 
    result[pos] = item; 
    for(int i = pos + 1; i < a.length + 1; i++) 
     result[i] = a[i - 1]; 
    return result; 
} 

private static Item[] removeArrayItem(Item[] arr, Item item) { 
    List<Item> list = new ArrayList<Item>(Arrays.asList(arr)); 
     for (int i = 0; i < list.size(); i++) { 
      if (list.get(i) == item) { 
       list.remove(i); 
      } 
     } 
    return list.toArray(new Item[0]); 
} 

новые методы (дающие java.lang.ArrayIndexOutOfBoundsException)

public static <T> T[] insertArrayElement(T[] arr, int pos, T item) { 
    final int N = arr.length; 
    T[] result = Arrays.copyOf(arr, N + 1); 
    for(int i = 0; i < pos; i++) 
     result[i] = arr[i]; 
    result[pos] = item; 
    for(int i = pos + 1; i < N + 1; i++) 
     result[i] = arr[i - 1]; 
    return result; 
} 

public static <T> T[] removeArrayElement(T[] arr, T item) { 
    List<T> list = new ArrayList<T>(Arrays.asList(arr)); 
     for (int i = 0; i < list.size(); i++) { 
      if (list.get(i) == item) { 
       list.remove(i); 
      } 
     } 
    return list.toArray(arr); 
} 

EDIT:

После прочтения некоторых из ответа я изменил removeArrayElement к настоящему времени:

public static <T> T[] removeArrayElement(T[] arr, T item) { 
    for (Iterator<T> iterator = list.iterator(); iterator.hasNext();) { 
     T t = iterator.next(); 
     if (t == item) { 
      iterator.remove(); 
     } 
    } 
    return list.toArray(arr); 
} 

, но он все еще по какой-то причине посылает эту: java.lang.ArrayIndexOutOfBoundsException

edit2: Полный исполняемый

bankContents[bankSlots[0]] = Utils.removeArrayElement(bankContents[bankSlots[0]], newbankVarient); 

Когда newBankVarient есть = bankContents [bankSlots [0]] [1] и его удаление, система из массива ПОСЛЕ является:

"[var, var, var, null] 
+5

Не используйте 'list.remove (i)' внутри цикла for. – vikingsteve

+0

Он также использовался в старом методе, но по какой-то причине новый метод запутывается, почему это так, btw его remove'i 'субъект цикла, его не удаляя один и тот же элемент снова и снова –

+0

Чтобы уточнить, что @vikingsteve говорит; вы можете использовать другой целочисленный список, в котором будут храниться значения 'i', для которых' list.get (i) == item' является истинным, а затем итератором в новом списке и удаляет все 'i' в списке – Laazo

ответ

1

без запуска кода, кажется вероятным, что removeArrayElement вызывает исключение.

Неплохая практика использования list.remove(i) из цикла for, который выполняет итерацию в одном цикле.

Либо вам нужно break; непосредственно после вызова remove(i), либо вы можете вместо этого использовать итератор, который «безопасен для удаления во время итерации».

Например: Java, Using Iterator to search an ArrayList and delete matching objects

Наконец, если T сопоставим, то вы должны быть в состоянии удалить из списка с помощью list.remove(item) - вам не нужно возиться с индексами, если вам не нужно.

0

Как упомянуто @vikingsteve, не используйте метод удаления внутри цикла, так как вы, скорее всего, опережаете возможные индексы.

Однако вы можете держать петлю и начинать цикл со спины, а не спереди.

что-то, как это будет делать:

public static <T> T[] removeArrayElement(T[] arr, T item) { 
    List<T> list = new ArrayList<T>(Arrays.asList(arr)); 
     for (int i = list.size()-1; i >= 0; i--) { 
      if (list.get(i) == item) { 
       list.remove(i); 
      } 
     } 
    return list.toArray(arr); 
} 
+0

Этот метод все еще дает java.lang.ArrayIndexOutOfBoundsException –

+0

Дайте мне секунду, я проверю, что с отладчиком –

+0

Этот конкретный метод по какой-то причине не удаляет элемент, а делает элемент = null, который затем вызывает массив за пределами границ, потому что в то же время, извне я миную переменную, которая редактирует размер главного массива –

0

удалить внутри петли на problem.eitger декремент я на 1 (я -), когда элемент будет удален или использовать петлю на основе итератора и вызвать Iterator.remove

0

для вашего EDIT 3, это правильное поведение, описанное в Javadoc

Если список помещается в указанном массиве с комнатой пощадить (т.е. массив имеет больше элементов s, чем список), элемент в массиве сразу , следующий за окончанием списка, имеет значение null. (Это полезно при определении длиной списка, только если абонент знает, что список не содержит нулевые элементы.)

Держите тип с пустой копией вашего массива

private static Item[] removeArrayItem(Item[] arr, Item item) { 
    Item[] emptyArray = Arrays.copyOf(arr, 0); 
    List<Item> list = new ArrayList<Item>(Arrays.asList(arr)); 
    for (Iterator<Item> iter = list.iterator(); iter.hasNext();) { 
     Item current = iter.next(); 
     if (item.equals(current)) { 
     iter.remove(); 
     break; 
     } 
    } 
    return list.toArray(emptyArray); 
} 

Btw, тест равенства по ref - это плохая оценка, предпочитайте равные, когда можете. Возможно, вы также можете, если ваши товары сопоставимы, используйте Arrays.binarySearch, чтобы получить индекс элемента, который вы хотите удалить, избегая итератора в пользу прямого использования remove (index) в списке.

Смежные вопросы