2010-11-15 2 views
2
class ArrayApp{ 

    public static void main(final String[] args){ 
     long[] arr; // reference to array 
     arr = new long[100]; // make array 
     int nElems = 0; // number of items 
     int j; // loop counter 
     long searchKey; // key of item to search for 
     // -------------------------------------------------------------- 
     arr[0] = 77; // insert 10 items 
     arr[1] = 99; 
     arr[2] = 44; 
     arr[3] = 55; 
     arr[4] = 22; 
     arr[5] = 88; 
     arr[6] = 11; 
     arr[7] = 00; 
     arr[8] = 66; 
     arr[9] = 33; 
     nElems = 10; // now 10 items in array 
     // -------------------------------------------------------------- 
     for(j = 0; j < nElems; j++){ 
      System.out.print(arr[j] + " "); 
     } 
     System.out.println(""); 
     // -------------------------------------------------------------- 
     searchKey = 66; // find item with key 66 
     for(j = 0; j < nElems; j++){ 
      if(arr[j] == searchKey){ 
       break; // yes, exit before end 
      } 
     } 
     if(j == nElems){ 
      System.out.println("Can’t find " + searchKey); // yes 
     } else{ 
      System.out.println("Found " + searchKey); // no 
     } 
     // -------------------------------------------------------------- 
     searchKey = 55; // delete item with key 55 
     for(j = 0; j < nElems; j++){ 
      if(arr[j] == searchKey){ 
       break; 
      } 
     } 
     for(int k = j; k < nElems - 1; k++){ 
      arr[k] = arr[k + 1]; 
     } 
     nElems--; // decrement size 
     // -------------------------------------------------------------- 
     for(j = 0; j < nElems; j++){ 
      System.out.print(arr[j] + " "); 
     } 
     System.out.println(""); 
    } // end main() 
} // end class ArrayApp 
  • Почему мы используем дж и nElems для поиска массива.
  • Почему мы снова назначаем j для k для удаления? Разве мы не можем удалить его из j ?
+0

Да боги. Некоторое простое форматирование сделало бы эту задачу легче проглотить. – skaffman

+0

это сделал sir – theband

+1

нет, * I * сделал –

ответ

0

nElemens используется для ускорения поиска. В приведенном выше примере массив имеет 100 полей. Поэтому вам нужно будет искать все 100 полей. Но так как nElemen (количество элементов) составляет всего 10, необходимо просто искать 10 элементов, а не все 100.

Но будьте осторожны: вышеприведенный алгоритм предполагает, что массив заполнен в правильном порядке, и может 't быть промежутками между полями, которые имеют значение.

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

E.g.

arr [5] обращается к полю 6. массива. arr [j] обращается к j. элемент в массиве. Основные сведения о Java петлями:

http://leepoint.net/notes-java/flow/loops/loops.html

0

Это трудно (не говоря уже давно) способ удаления элемента из массива. Есть другие более простые способы, в том числе:

Проверьте это на документы Java.

+0

Настоящий, но я предполагаю, что здесь нужно продемонстрировать, как это работает. arraycopy и ArrayList.remove делают по существу то же самое, что и выше, хотя я предполагаю более эффективно. – Jay

0

На самом деле, это не очень хорошая практика для удаления элементов из [] в Java. Они статически распределены, и [].length не могут быть изменены в любом случае. Что ты хочешь делать? Используйте динамические массивы, списки и т. Д. Например, используйте ArrayList.

0

Ваша идея состоит в реализации массива «resizable» на массив java (который имеет фиксированный размер). Первыми nElem элементами в этом фиксированном массиве являются логический массив. Теперь вы хотите, чтобы иметь возможность устанавливать и удалять элементы и из этого логического массива:

[00] [01] [02] [03] [04] [05] [06] [07] [08] [09] ... [99] // physical array 
[00] [01] [02] [03] [04] [05] [06] [07] [08]    // logical array, nElem = 9 
Insert '99' at (logical) position 04 
[00] [01] [02] [03] [99] [04] [05] [06] [07] [08]   // nElem = 10 
Delete value at (logical) position 03 
[00] [01] [02] [99] [04] [05] [06] [07] [08]    // nElem = 9 

Размер массива Java по-прежнему 100 (это фиксированная), размер логического массива (nEleme) должен настраиваться после каждой вставки и снимать операцию.

Если вы вставляете элемент, вам нужно «сдвинуть» некоторые элементы «вправо» (и увеличить nElem). Для этого вам понадобится цикл for и счетчик (j). То же самое происходит, если вы хотите удалить элемент, вам нужно «сдвинуть» элементы «влево» и снова вам понадобится счетчик.

Почему мы используем j и nElems для поиска массива.

Для поиска элемента в (несортированных) коллекции (массив, набор, ..), вы должны смотреть на каждый элемент, может быть, начиная с индекса = 0 до индекса = (nElem-1). Если значение в текущей позиции соответствует вашим критериям поиска (пример: is-equal-to), вы можете разбить поиск. j хранит этот фактический индекс, nElem то размер (логического) массива так (nElem-1) индекс последнего элемента в этом (логический) массив)

Почему мы снова назначить J к к для удаления? Разве мы не можем удалить его из j?

Просто для чтения. Это тоже будет работать, но гораздо труднее понять.

for(j = 0; j < nElems; j++) { 
    if(arr[j] == searchKey) { 
     break; 
    } 
} 
for(;j < nElems-1; j++) { // note the missing initialzing value for the loop 
    arr[j] = arr[j+1]; 
} 
0

Если у вас есть Обще-языки libary Apache, вы можете попробовать

inputArray = ArrayUtils.remove(inputArray , indexOfElement); 

метод возвращает новый массив, созданный путем удаления найденного элемента из исходного массива.

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