2016-04-28 4 views
1

В моем стремлении продолжить обучение в Java Я пытаюсь выяснить, есть ли собственный метод Java, который быстро и эффективно позволяет искать строковое значение в массиве ArrayList.Обратный поиск значений массива ArrayList из массива

Вот мой код, который показывает, что я пытаюсь сделать:

public void exampleArrayListofArray() { 
     ArrayList<String []> al = new ArrayList<>(); 
     al.add(new String[] {"AB","YZ"}); 
     al.add(new String[] {"CD","WX"}); 
     al.add(new String[] {"EF","UV"}); 
     al.add(new String[] {"GH","ST"}); 
     al.add(new String[] {"IJ","QR"}); 
     al.add(new String[] {"KL","OP"}); 
     displayArrayListofArray(al); 
    } 

    public void displayArrayListofArray(List<String []> al) { 

     for (String [] row : al) 
      for (int column = 0; column <= 1 ; column ++){ 
       System.out.println("Value at Index Row " + al.indexOf(row) + 
         " Column " + column + " is " + (row)[column]); 
      } 

     String lookUpString = "YZ"; 
     lookUpMethod(al, lookUpString); 
     lookUpString = "ST"; 
     lookUpMethod(al, lookUpString); 
     lookUpString = "IJ"; 
     lookUpMethod(al, lookUpString); 
     lookUpString = "AA"; 
     lookUpMethod(al, lookUpString); 
    } 

    public void lookUpMethod(List<String []> al, String lookUpString) { 
     boolean isStringFound = false; 
     for (String[] row : al) { 
      for (int column = 0; column <= 1; column++) { 
       if (al.get(al.indexOf(row))[column] == lookUpString) { 
        System.out.println("Index of '" + lookUpString + "': " + al.indexOf(row) + column); 
        isStringFound = true; 
       } 
      } 
     } 
     if (!isStringFound) { 
      System.out.println("Search string '" + lookUpString + "' does not exist."); 
     } 
    } 

Это самый эффективный способ поиска мой ArrayList для данной строки? Есть ли что-то, что я должен сделать, чтобы сделать мой код более эффективным (помимо использования ArrayList)?

Я знаю, что, возможно, для того, чтобы делать то, что я пытаюсь сделать здесь, могут быть более эффективные способы сделать это, чем ArrayList, такие как HashMap, но с моими очень ограниченными знаниями Java. Я продвигаюсь с ArrayList и нужно начинать с нуля с помощью HashMap. Сама конечная цель моего кода сделать следующее:

  1. Прочитайте текст активов файл для загрузки ArrayList
  2. Поиска ArrayList для пользователя, вводимого значения
  3. сделать некоторый Calcs с соседними значениями искомая строка
  4. Позволяет пользователю обновить соседние значения в искомом строке
  5. Разрешить пользователю добавлять новую строку, если искомая строка не найдена
  6. Сохранить все изменения обратно в текстовый актив файл в аль phabetical заказ

Airfix

+0

Существуют естественные способы поиска элементов любой заданной 'Collection', но в этом случае вы просматриваете каждый массив в данной коллекции, поэтому нет никакого родного способа. Для более упорядоченного, сжатого и «декларативного» алгоритма я бы посоветовал использовать Java 8 lambdas. – Mena

+0

Если вы отсортировали коллекции раньше, вы можете применить двоичный поиск, который будет работать в O (log n) вместо O (n). Кроме того, вы можете вернуться из метода поиска, если вы нашли одно совпадение, а не пробегали все остальные оставшиеся списки и массивы. – Palle

+3

Также я мог бы найти ошибку: если вы проверите строки для равенства, вы должны использовать 'firstString.equals (secondString)' -Method. Оператор '==' -Operator возвращает true, если обе ссылки на String указывают на то же место в памяти. – Palle

ответ

1

Мой ответ: не беспокойтесь.

Я думаю, что вы смотрите на это с неправильного угла: если вы обнаружите, что пользователи вашего приложения имеют проблему «производительности»; и если вы затем выполните профилирование, а затем профилирование показывает, что ваш текущий «поисковый» код является «виновником» (единственное горячее пятно, которое убивает «воспринимаемую конечную производительность»); то вам придется укусить пулю и узнать об использовании разных структур данных, чем ArrayLists. (сторона примечания там: на самом деле, Set/HashSet не так много «разных», научиться их использовать ... не так много, как могло бы звучать).

Но: если вы ответили на любой из вышеуказанных «вопросов» с «нет» (например: у вас нет пользователей, которые жалуются на плохую производительность) ... тогда нет смысла беспокоиться о производительности.

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

(как сказано: с точки зрения изучения, я бы по-прежнему рекомендовал вам сохранить ваш код и начать новую версию, которая использует наборы. Существует множество учебных пособий, которые объясняют все, что вам нужно знать).

Но только для того, чтобы дать вам какое-то направление: ваш главный убийца «производительности» (как вы сами считаете) нецелесообразным использованием структур данных. Нет никакого преимущества в использовании ArrayList для хранения массивов строк, которые вы хотите найти. Это добавляет «два слоя»; каждый из которых требует, чтобы ваш код повторял эти «списки» последовательным образом. Если бы вы использовали один набор (например, HashSet); и добавьте все ваши «строки поиска» к этому набору, весь ваш «поиск» для совпадений ... сводится к тому, чтобы задать этот набор: «вы указываете это значение».

+0

«В моих поисках продолжения обучения в Java» я думаю, что сейчас он беспокоится об этом, поэтому ему не нужно в будущем, если он сказал проблема возникает –

+0

Я не думаю, что будут какие-то ощущения от моих пользователей (изначально только я). Конечный ArrayList будет иметь длину от 100 до 150 строк. Тем не менее, я пытаюсь получить работоспособное решение с минимальными затратами времени прямо сейчас. Затем, после того, как он работает, через процесс пересмотра, я хочу пойти и затянуть все, так как растет знание java. Я думаю об этом сейчас, поэтому я знаю, что изучать для будущих улучшений. Можете ли вы указать мне в сторону достойного учебника по хэшсету? – Airfix

+0

@Airfix Сторона примечания: «воспринимаемая производительность» происходит с двух концов: сначала эффективность ваших вычислений; то из размера ваших данных. Так может быть, 150 шаблонов поиска; но сколько строк в ваших файлах. Если вы говорите о <100000 ... наверное, еще ничего не значимо. Но если ваши файлы ** большие ** ... вы быстро узнаете разницу между O (n * n) и O (1). (найдите большую нотацию, чтобы понять, что я имею в виду) – GhostCat

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