2015-08-19 89 views
1

我必须创建一个程序,它接受用户输入(一个数字),然后程序应该有该数字并将搜索应用到该数组,并通过匹配索引和输出相应的标题用户输入的号码。但是在运行期间,没有任何反应。我在代码中设置了破坏者,并注意到for循环(搜索算法)存在问题。请帮助我,让我知道我的搜索算法有什么问题。我想要做的是使用用户输入的数字来匹配索引,然后输出存储在索引中的书名。将线性搜索和二进制搜索应用到数组

 private void btnFindActionPerformed(java.awt.event.ActionEvent evt) {           
    // TODO add your handling code here: 

    // declares an array 
    String[] listOfBooks = new String [101]; 

    // assigns index in array to book title 
    listOfBooks[1] = "The Adventures of Tom Sawyer"; 
    listOfBooks[2] = "Huckleberry Finn"; 
    listOfBooks[4] = "The Sword in the Stone"; 
    listOfBooks[6] = "Stuart Little"; 
    listOfBooks[10] = "Treasure Island"; 
    listOfBooks[12] = "Test"; 
    listOfBooks[14] = "Alice's Adventures in Wonderland"; 
    listOfBooks[20] = "Twenty Thousand Leagues Under the Sea"; 
    listOfBooks[24] = "Peter Pan"; 
    listOfBooks[26] = "Charlotte's Web"; 
    listOfBooks[31] = "A Little Princess"; 
    listOfBooks[32] = "Little Women"; 
    listOfBooks[33] = "Black Beauty"; 
    listOfBooks[35] = "The Merry Adventures of Robin Hood"; 
    listOfBooks[40] = "Robinson Crusoe"; 
    listOfBooks[46] = "Anne of Green Gables"; 
    listOfBooks[50] = "Little House in the Big Woods"; 
    listOfBooks[52] = "Swiss Family Robinson"; 
    listOfBooks[54] = "The Lion, the Witch and the Wardrobe"; 
    listOfBooks[54] = "Heidi"; 
    listOfBooks[66] = "A Winkle in Time"; 
    listOfBooks[100] = "Mary Poppins"; 

    // gets user input 
    String numberInput = txtNumberInput.getText(); 
    int number = Integer.parseInt(numberInput); 

    // Linear search to match index number and user input number 
     for(int i = 0; i < listOfBooks.length - 1; i++) { 
     if (listOfBooks.get(i) == number) { 
     txtLinearOutput.setText(listOfBooks[i]); 
     break; 
     } 


    } 

* if语句中的listOfBooks.get存在问题。此外,我需要应用二进制搜索,将使用二进制方法搜索相同的数组。需要帮助来应用这种类型的二进制搜索。

我该如何做一个语句来检查int数是否等于索引?

请注意,以下代码仅仅是我必须应用的一个示例。变量都是为了举例的目的:

public static Boolean binarySearch(String [ ] A, int left, int right, String V){ 
    int middle; 

    if (left > right) { 
     return false; 
    } 

    middle = (left + right)/2; 
    int compare = V.compareTo(A[middle]); 
    if (compare == 0) { 
     return true; 
    } 
    if (compare < 0) { 
     return binarySearch(A, left, middle-1, V); 
    } else { 
     return binarySearch(A, middle + 1, right, V); 
    } 
} 
+0

你与输入号码,这是没有意义的,你想了解BinarySearch的 – SSH

+0

做配套的书籍名称?如果不是,你可以使用'List'或'Map',它变得非常简单,几乎在O(1)的时间内搜索。 –

+0

我怎样才能将输入号码与索引号码匹配? –

回答

4

就可以避免for loop和只是给这样的号码查询条件:txtLinearOutput.setText(listOfBooks[number-1]);

删除代码

// Linear search to match index number and user input number 
for(int i = 0; i < listOfBooks.length - 1; i++) { 
    if (listOfBooks.get(i) == number) { 
    txtLinearOutput.setText(listOfBooks[i]); 
    break; 
} 

try{ 
    int number = Integer.parseInt(numberInput); 
    if(number>0 && number<101){ 
     txtLinearOutput.setText(listOfBooks[number-1]); 
    }else{ 
     // out of range 
    } 
}catch(Exception e){ 
    // handle exception here 
} 
+0

谢谢!我现在明白了。现在我需要关于二进制的帮助! –

+0

二进制搜索你的数组必须按排序顺序 – Rustam

+0

我该怎么做? –

2

您正在比较if (listOfBooks.get(i) == number)这是错的,你的应该比较:if (i == number),因为你需要比较元素的位置。

0

这不是一个二进制搜索答案。只是执行HashMap。看看它。

HashMap<String, Integer> books = new HashMap(); 
books.put("abc", 1); 
books.put("xyz", 2); 
books.put("pqr", 3); 
books.put("lmo", 4); 

System.out.println(books.getValue("abc"); 

使用内置的二分查找。

String []arr = new String[15]; 
arr[0] = "abc"; 
arr[5] = "prq"; 
arr[7] = "lmo"; 
arr[10] = "xyz"; 
System.out.println(Arrays.binarySearch(arr, "lmo")); 

如何使用二进制搜索比较Strings

String[] array = new String[4]; 
     array[0] = "abc"; 
     array[1] = "lmo"; 
     array[2] = "pqr"; 
     array[3] = "xyz"; 
     int first, last, middle; 
     first = 0; 
     last = array.length - 1; 
     middle = (first + last)/2; 
     String key = "abc"; 
     while (first <= last) { 
      if (compare(array[middle], key)) 
       first = middle + 1; 
      else if (array[middle].equals(key)) { 
       System.out.println(key + " found at location " + (middle) + "."); 
       break; 
      } else { 
       last = middle - 1; 
      } 
      middle = (first + last)/2; 
     } 
     if (first > last) 
      System.out.println(key + " is not found.\n"); 

    } 

    private static boolean compare(String string, String key) { 
     // TODO Auto-generated method stub 
     for (int i = 0; i < Math.min(string.length(), key.length()); ++i) 
      if (string.charAt(i) < key.charAt(i)) 
       return true; 
     return false; 

    } 
+0

LOL我希望它是那么简单,但我必须将它应用于我已经放在那里的代码。 –

0

,你在这里做什么:

if (listOfBooks.get(i) == number) {

是,你是匹配与输入号码,这是无关紧要的数组的内容。

您可以直接使用输入号码来获取存储在索引处的值。

例如:
txtLinearOutput.setText(listOfBooks[number-1]);

另外,int number = Integer.parseInt(numberInput);应放在try-catch块内验证输入数字分析。你可以检查,如果输入的号码是数组的范围内,以避免类似情况除外:

try{ 

    int number = Integer.parseInt(numberInput); 

    // Linear search to match index number and user input number 
    if (number > 0 && number <=100) { 
     txtLinearOutput.setText(listOfBooks[number-1]); 
    } else { 
    // Display error message 
    } 
} catch(Exception e) { 
    // Handle exception and display error message 
} 

和使用二进制搜索,字符串数组需要进行排序。您可以使用Arrays.sort()方法对其进行分类。 并采用二进制搜索有关,可以使用Java Arrays Binary Search method

0

你的线性搜索代码看起来像这样

try{ 
txtLinearOutput.setText(listOfBooks[yourNumber]); 
} 
catch(IndexOutOfBoundsException ie){ 
// prompt that number is not an index 
} 
catch(Exception e){ 
// if any other exception is caught 
}