2011-03-17 97 views
0

我正在编写一个程序来搜索一个字符串,并告诉我它是否被发现。Java我的程序的数组没有显示任何值

import java.io.*; 


public class BinarySearchTest 
{ 
    public static void main(String [] args) throws IOException 
    { 
     int result; 
     String searchValue; 
     String input; 

     // An array of numbers to search. 
     String[] numbers = {"Jake", "Jerry", "Bill", "Lousie", "Goku", "Ivan", "John", "sarah", "kim"}; 

     // Create the console input objects. 
     InputStreamReader reader = 
       new InputStreamReader(System.in); 
     BufferedReader keyboard = 
       new BufferedReader(reader); 

     // First we must sort the array in ascending order. 
     IntQuickSorter.quickSort(numbers); 

     do 
     { 
     // Get a value to search for. 
     System.out.print("Enter a value to search for: "); 
     input = keyboard.readLine(); 
     searchValue = input; 

     // Search for the value 
     result = IntBinarySearcher.i; 

     // Display the results. 
     if (result == -1) 
      System.out.println(searchValue + " was not found."); 
     else 
     { 
      System.out.println(searchValue + " was found at " + 
           "element " + result); 
     } 

     // Does the user want to search again? 
     System.out.print("Do you want to search again? (Y or N): "); 
     input = keyboard.readLine(); 
     } while (input.charAt(0) == 'y' || input.charAt(0) == 'Y'); 
    } 
} 




public class IntBinarySearcher 
{ 
    static int i; 





    public static int search(String[] numbers, String value) 
    { 
     int first;  // First array element 
     int last;  // Last array element 
     int middle;  // Mid point of search 
     int position; // Position of search value 
     boolean found; // Flag  

     // Set the initial values. 
     first = 0; 
     last = numbers.length - 1; 
     position = -1; 
     found = false; 

     setI(Integer.parseInt(value)); 

     // Search for the value. 
     while (!found && first <= last) 
     { 
     // Calculate mid point 
     middle = (first + last)/2; 

     // If value is found at midpoint... 
     if (numbers[middle].equals(value)) 
     { 
      found = true; 
      position = middle; 
     } 

     // else if value is in lower half... 
     // need tell is value is less then the integer?, with out using equality regulators 
     else if (value.compareTo(numbers[middle]) < 0) 
      last = middle - 1; 
     // else if value is in upper half.... 
     else 
      first = middle + 1; 
     } 

     // Return the position of the item, or -1 
     // if it was not found. 
     return position; 
    } 

    public static void setI(int i) 
    { 
     IntBinarySearcher.i = i; 
    } 

    public static int getI() 
    { 
     return i; 
    } 
} 






public class IntQuickSorter 
{ 


    public static void quickSort(String[] numbers) 
    { 
     doQuickSort(numbers, 0, numbers.length - 1); 
    } 



    private static void doQuickSort(String[] numbers, int start, int end) 
    { 
     int pivotPoint; 

     if (start < end) 
     { 
     // Get the pivot point. 
     pivotPoint = partition(numbers, start, end); 

     // Sort the first sub list. 
     doQuickSort(numbers, start, pivotPoint - 1); 

     // Sort the second sub list. 
     doQuickSort(numbers, pivotPoint + 1, end); 
     } 
    } 



    private static int partition(String[] numbers, int start, int end) 
    { 
     String pivotValue; // To hold the pivot value 
     int endOfLeftList; // Last element in the left sub list. 
     int mid;   // To hold the mid-point subscript 

     // Find the subscript of the middle element. 
     // This will be our pivot value. 
     mid = (start + end)/2; 

     // Swap the middle element with the first element. 
     // This moves the pivot value to the start of 
     // the list. 
     swap(numbers, start, mid); 

     // Save the pivot value for comparisons. 
     pivotValue = numbers[start]; 

     // For now, the end of the left sub list is 
     // the first element. 
     endOfLeftList = start; 

     // Scan the entire list and move any values that 
     // are less than the pivot value to the left 
     // sub list. 
     for (int scan = start + 1; scan <= end; scan++) 
     { 
     if (pivotValue.compareTo(numbers[scan])< 0) // pivotValue.compareTo(numbers[scan])< 0) 
     { 
      endOfLeftList++; 
      swap(numbers, endOfLeftList, scan); 
     } 
     } 

     // Move the pivot value to end of the 
     // left sub list. 
     swap(numbers, start, endOfLeftList); 

     // Return the subscript of the pivot value. 
     return endOfLeftList; 
    } 

    /** 
     The swap method swaps the contents of two elements 
     in an int array. 
     @param The array containing the two elements. 
     @param a The subscript of the first element. 
     @param b The subscript of the second element. 
    */ 

    private static void swap(String[] numbers, int a, int b) 
    { 
     String temp; 

     temp = numbers[a]; 
     numbers[a] = numbers[b]; 
     numbers[b] = temp; 
    } 
} 
+0

如果输入账单例如输入一个值来搜索:Bill Bill找到了元素0. – user663428 2011-03-17 16:20:22

+0

那么你的问题是什么?如果您有任何错误,请详细说明错误消息。如果输出错误,请描述预期的和实际的输出。您给出的示例听起来正确:“Bill”应该是数组排序后的第一个元素。 – 2011-03-17 16:22:47

+0

这是相当多的代码,并没有太多的描述你怀疑问题的地方。这可能有助于将其缩减为一个简短的(也许是10行)示例,这对于相对简单的问题应该是直截了当的,甚至可能导致您解决自己的问题!见[sscce.org](http://sscce.org/)。 – 2011-03-17 16:23:34

回答

5

有东西丢失:

searchValue = input; 

//IntBinarySearcher.search(numbers, searchValue); here? 

// Search for the value 
result = IntBinarySearcher.i; 

编辑:

这不会工作,要么因为IntBinarySearcher.i是从来没有 “正确” 设置(见EDIT 2):)。

更好:

result = IntBinarySearcher.search(numbers, searchValue); 

编辑2:

哦,这将抛出值= “条例” NumberFormatException异常:setI(Integer.parseInt(value));

2

您似乎没有执行搜索。您需要行:

IntBinarySearcher.search(numbers, searchValue); 

前行:

result = IntBinarySearcher.i; 
+0

好吧,这是我的问题,谢谢。 – user663428 2011-03-17 16:26:33

0

你不叫IntQuickSorter.search()任何地方。说它是后

searchValue = input; 
0

我没有在你的代码看看你正在调用IntBinarySearcher.search。没有这个我不会被设置为任何东西,对吧?

相关问题