2013-09-14 4 views
-3

Я уже некоторое время смотрю на этот код, и я думаю, что есть способ его оптимизировать (а именно оператор if-else с помощью for-loops). Любые советы будут очень признательны.Оптимизация If-statement with for-loop

Заранее благодарен!

/** 
* search method searches through the contact list for a given criteria 
* and displays all results. 
* @param searchString is type String. 
* @param type is type String. 
* @param numberOfContacts is type int. 
* @param contacts is type Person[]. 
*/ 
public static void search(String searchString, String type, int numberOfContacts, Person[] contacts) { 
    // Initialize variables for results 
    int found = 0; 
    int[] results = new int[numberOfContacts]; 

    // Determine the type of search 
    if (type.equals("name")) { 
     // Search by name 
     for (int x = 0; x < numberOfContacts; x++) { 
      if (contacts[x].getName().contains(searchString)) { 
       results[found] = x; 
       found++; 
      } 
     } 
    } else { 
     // Search by phone 
     for (int x = 0; x < numberOfContacts; x++) { 
      if (contacts[x].getPhone().contains(searchString)) { 
       results[found] = x; 
       found++; 
      } 
     } 
    } 

    // Display the search results 
    System.out.println("\n\t**************"); 
    System.out.println("\tSearch Results"); 
    System.out.println("\t**************"); 
    System.out.println("Found " + found + " results containing \"" + searchString + "\":"); 
    System.out.println(); 

    if (found > 0) { 
     for (int x = 0; x < found; x++) { 
      System.out.println(contacts[results[x]].getName() + "\t" + contacts[results[x]].getPhone()); 
     } 
    } 

    System.out.println("\n\n\n"); 
} 
+2

Вы пытаетесь оптимизировать скорость или читаемость? – Tharwen

+0

используйте шаблон стратегии, чтобы быть более элегантным, используя такие интерфейсы, как 'Searchable' с методом поиска. – nachokk

+0

Я ищу, чтобы оптимизировать его для скорости. Я хотел бы удалить избыточную логику и т. Д. Я совершенно не привык к программированию, и я просто возвращаюсь в школу для получения степени компьютерной науки. Попытка расширить мое обучение за пределами класса. – user2778322

ответ

-1

Существует отличный способ его оптимизации. Две Карты, одна с именем в качестве ключа и с номером телефона. Если карта имени-человека является TreeMap, вы также получите ее в алфавитном порядке. Получает почти полностью весь метод, который у вас есть.

+0

Спасибо за ввод. Я должен был добавить к факту, что мне нужно использовать массивы ... поскольку это требование назначения. У меня завершено задание и не на несколько дней, поэтому я просто смотрю, как я могу улучшить, оставаясь в пределах параметров назначения. – user2778322

+0

Тогда ваш код довольно приличный. Карты в любом случае не работали бы с вашим кодом, поскольку они подсчитывают записи. Вы можете избавиться от параметра numberOfContacts, хотя, так как это то же самое, что и contacts.length (не так ли?). – Kayaman

+0

Вы правы. НомерOfContacts фактически передается из основного метода, который использует другой метод для чтения текстового файла и получения количества контактов, и эта переменная вытекает из этого. – user2778322

1

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

public static void search(String searchString, String type, int numberOfContacts, Person[] contacts) { 
    // Initialize variables for results 
    int found = 0; 
    int[] results = new int[numberOfContacts]; 

    // Display the search results 
    System.out.println("\n\t**************"); 
    System.out.println("\tSearch Results"); 
    System.out.println("\t**************"); 
    System.out.println("Found " + found + " results containing \"" + searchString + "\":"); 
    System.out.println(); 


     // Determine the type of search 
     for (int x = 0; x < numberOfContacts; x++) { 
      if (type.equals("name")) { 
       // Search by name 
       if (contacts[x].getName().contains(searchString)) { 
        results[found] = x; 
        found++; 
        System.out.println(contacts[results[x]].getName() + "\t" + contacts[results[x]].getPhone()); 
       } 
      } 
      else { 
       // Search by phone 
       if (contacts[x].getPhone().contains(searchString)) { 
        results[found] = x; 
        found++; 
        System.out.println(contacts[results[x]].getName() + "\t" + contacts[results[x]].getPhone()); 

      } 
     } 
    } 
    System.out.println("\n\n\n"); 
} 

Примечание: O (2n) такая же, как O (N) в долгосрочной перспективе (если п супер огромный ... п является размер списка контактов). Однако это хороший начальный шаг к повышению эффективности.

+1

строго говоря, O (2n) - это не что-то. O (2n) - O (n), если вы знаете, что означает O – Cruncher

+0

. Я знаю, но это простое улучшение временной сложности, поскольку он может использовать только массивы. –

+0

Очень хорошая точка! Благодарю. – user2778322