2011-03-17 3 views
0

정수 대신 문자열을 사용하는 이진 검색 프로그램을 설정하려고합니다. 문제는 문자열 값보다 적은 수의 배열을 만드는 방법을 모르겠다는 것입니다. 문자열 값보다다른 요소보다 적은 요소를 찾는 방법은 무엇입니까?

문자열 배열 이하 예컨대

.

/** 
    The StringBinarySearcher class provides a public static 
    method for performing a binary search on an String array. 
*/ 



public class StringBinarySearcher 
{ 
    /** 
     The search method performs a binary search on an String 
     array. The array is searched for the number passed to 
     value. If the number is found, its array subscript is 
     returned. Otherwise, -1 is returned indicating the 
     value was not found in the array. 
     @param numbers The array to search. 
     @param value The value to search for. 
    */ 



    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 inital values. 
     first = 0; 
     last = numbers.length - 1; 
     position = -1; 
     found = false; 

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

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

     // else if value is in lower half... 
     // needs array to be less then the string value?, without using equality regulators 
     else if (numbers[middle].compareTo(numbers[middle +1]) > 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; 
    } 
} 
+0

왜 문자열 배열에서 이진 검색을 수행하려면 숫자 배열이 필요하다고 생각하십니까? –

+0

BTW,'if (numbers [middle] == value)'가 잘못 비교 된 경우'if (numbers [middle] .equals (value)) '를 사용하십시오. – MByD

+0

정수가 아닌 숫자로 정수를 정렬 할 수 있습니까? – user663428

답변

1

제 1 비교는 :

if (numbers[middle] == value) 

== 연산자를 사용하지한다. String 객체를 비교한다는 것을 기억하십시오. equals 방법을 사용하거나 compareTo을 사용해야합니다.

당신이 다음 비교는 다음과 같습니다

// else if value is in lower half... 
// needs array to be less then the string value?, without using equality regulators 
else if (numbers[middle].compareTo(numbers[middle +1]) > 0) 

당신이 value 배열의 아래쪽에 있지만, 코드가 다음에 배열 요소를 비교되어 있는지 확인하고 귀하의 의견에 따르면, 배열 요소. 의견 일치가 있어야한다 :

else if (value.compareTo(numbers[middle]) < 0) 

는 또한, 숫자 당신이하고있는 방식을 나타내는 문자열을 비교할 때 몇 가지 이상한 찾고 결과를 얻을 수 있음을 유의하시기 바랍니다. compareTo 메서드는 문자열을 사전 식으로 비교합니다. 예를 들어, "5"는 "11"보다 큰 것으로 평가됩니다.

+0

else if (value.compareTo (numbers [middle]) <0)는 값보다 작은 하나의 요소 만 비교할 수 없습니다. – user663428

+0

@ user663428 : 'value'가 (알파벳 순으로) 배열의 중간 요소보다 작 으면 'true'를 반환합니다. –

2

문제는 비교 연산자 (==)입니다. 비교 연산자는 Java의 기본 데이터 유형에 대해서만 잘 정의되어 있습니다. 문자열은 클래스입니다 (기본 데이터 유형이 아님). 따라서 문자열을 비교하려면 String의 equals(String) 메서드를 사용해야합니다.

숫자로 비교하려면 숫자를 정수로 파싱해야합니다. 이를 위해 Integer.parseInt(String)을 사용하고 정수를 비교할 수 있습니다.

+0

좋아, 그 사실을 잊어 버렸어. 나는 더 잘 알아야한다. – user663428

0

기본 데이터 형식의 경우에는 정상적으로 작동합니다. String 객체에는 적합하지 않습니다.

== 두 개체의 참조가 같은지 여부를 확인하는 데 사용됩니다. "=="두 객체의 내용을 비교하지 않습니다.

String strName1 = "Me"; 
String strName2 = new String("Me"); 

strName1 == strName2은 거짓입니다. 그들은 두 개의 다른 대상을 언급하기 때문에.

비교를 수행하려면 equals 메서드를 사용할 수 있습니다.

if (strName2 .equals(strName2)) { 
    System.out.println("Me and Me are same :P"); 
} 
관련 문제