Поиск в ArrayList - PullRequest
       5

Поиск в ArrayList

2 голосов
/ 04 января 2012

В настоящее время у меня есть 3 класса, основной класс, содержащий GUI, в котором я вызываю этот метод, класс customer, содержащий данные, и класс customerList, который собирает данные из класса customer, помещает их в массив список, а также содержит метод поиска arraylist.

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

Всякий раз, когда я запускаю метод, «System.out.println (customer.returnFamilyName ());» В строке всегда отображается первая фамилия моего автора.

Не стесняйтесь спрашивать дополнительную информацию, я не уверен, насколько хорошо я это объяснил.

Вот мой метод:

public void searchCustomer(String familyName) {
    int index = 0;
    boolean found = false;
    customer customer;
    while(index < CustomerList.size() && !found) {
        customer = CustomerList.get(index);
        if(customer.returnFamilyName().equalsIgnoreCase(familyName)) {
            found = true;
            break;
        }
        if(found == true) {
            ;
        }
        System.out.println(customer.returnFamilyName());
        index++;
        return;
    }
}

Ответы [ 5 ]

2 голосов
/ 04 января 2012

Удалите ; в if (found == true);, потому что это читается как: if this condition is true, do notihng и всегда используйте фигурные скобки:

if (found == true) {
   System.out.println(customer.returnFamilyName());
}

Кроме того, включите приращение в цикл while, иначе вы недействительно повторяю что-нибудь.

Этот код работает, потому что ваш первый элемент совпадает с искомым элементом, попробуйте другой, и вы попадете в бесконечный цикл.

Попробуйте использовать версию, подобнуюthis:

public void searchCustomer( String familyName ) {

    for ( customer current : CustomerList ) {           
        if ( current.returnFamilyName().equalsIgnoreCase( familyName )) {
            System.out.println( current.returnFamilyName() );
            break;
        }
     }
}

Некоторые дополнительные замечания:

В Java предложения должны начинаться с верхнего регистра, поэтому имя класса должно быть объявлено как Customer вместо customer, а переменные начинаются с нижнего регистраследовательно, CustomerList должно быть customerList.Методы могут избегать части return и иметь имена с get

Кроме того, методы поиска должны лучше возвращать найденное значение, а не печатать его, поэтому ваша окончательная версия может выглядеть так:

public Customer searchCustomer( String familyName ) {
    for ( Customer current : customerList ) {
       if ( current.getFamilyName().equalsIgnoreCase( familyName ) )  {
          return current;
       }
     }
     return null;
 }
2 голосов
/ 04 января 2012

Из вашего вопроса не ясно, что на самом деле предполагаемое поведение равно . Кроме того, что это?

if (found == true);

Предположительно, вы имели в виду:

if (found) { 
    System.out.println...
}

Но что, если одна и та же фамилия встречается в вашем списке дважды? Кроме того, почему не используется Map вместо List? Поиск изменится с O(n) на O(1)

0 голосов
/ 04 января 2012

Не забудьте увеличить цикл while, иначе он может работать бесконечно.

Вы можете использовать так называемый "расширенный цикл for" , который позволяет отказаться от необходимости увеличивать значения над CustomerList полностью. У вас есть объект customer, поэтому мы можем использовать его следующим образом:

for (customer cus: CustomerList) {
     if(cus.returnFamilyName().equalsIgnoreCase(familyName)) {
        System.out.println(cus.returnFamilyName());
        return;
     }
}

Если вы решите придерживаться своего исходного кода (что хорошо), то обратите внимание на изменения в вашем коде ниже.

while(index < CustomerList.size()) {
    customer = CustomerList.get(index);
    if (customer.returnFamilyName().equalsIgnoreCase(familyName)) { 
        System.out.println(customer.returnFamilyName());
        break;
    } else {  
        index++;
    }
}
0 голосов
/ 04 января 2012

Вы никогда не увеличиваете индекс.

Код должен быть:

public void searchCustomer(String familyName) {
    for (customer customer : CustomerList) {
        if (customer.returnFamilyName().equalsIgnoreCase(familyName)) {
            System.out.println(customer.returnFamilyName());
            break;
        }
    } 
}

Кроме того, класс 'customer' должен называться 'Customer', поскольку имена классов должны начинаться с заглавной буквы, 'returnFamilyName' должно быть 'getFamilyName', поскольку методы доступа по соглашению называются 'get' + имя поля и 'CustomerList 'должен быть' customerList ', так как имена полей должны начинаться со строчной буквы.

0 голосов
/ 04 января 2012

Я бы предложил попробовать это:

System.out.println(customer.returnFamilyName());
                index++;
if(found == true) { return;}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...