【问题标题】:Java utils binary search not finding all values [duplicate]Java utils二进制搜索未找到所有值[重复]
【发布时间】:2013-04-17 05:44:16
【问题描述】:

我正在尝试在数组中搜索一个值,并决定使用内置的二进制搜索来执行此操作。我有一堂课:

import java.util.*;
public class Charge {
private int isAcct;
private int[] acctNumbers = {5658845,4520125,7895122,8777541,8451277,
1302850,8080152,4562555,5552012,5050552,7824577,
                    1250255,1005231,6545231,3852085,7576651,7881200,
                    4851002};


public Charge(int aNum) {
    isAcct = aNum;
}
public Boolean isValidAcctNumber() {
    int m = Arrays.binarySearch(acctNumbers, isAcct);
    if (m == -1)
        return false;
    else
        return true;
}
} 

还有一个测试:

import java.util.Scanner;
public class ChargeTest {
public static void main(String[] args){
    Scanner scan = new Scanner(System.in);
    System.out.println("What is your account number?: ");
    int num = scan.nextInt();
    Charge charge = new Charge(num);
    System.out.println(charge.isValidAcctNumber());

    if (charge.isValidAcctNumber() == false) {
        System.out.println("Your account "+num+" is not a valid account");
    } else  {
        System.out.println("Your account "+num+" is a valid account");
    }
}

}

这适用于某些数字,例如 4851002,但不适用于其他数字,例如 1302850。我真的不知道为什么。我很可能只是手动实现二进制搜索,但我对为什么这不起作用感到困惑。

【问题讨论】:

  • 在提出问题之前,您确实应该至少阅读部分二进制搜索文档。
  • JavaDoc 明确指出:数组必须排序。如果 JDK 的某些部分行为不端,请在发布问题之前阅读它的文档。

标签: java binary-search


【解决方案1】:

如果 Java 使用链接,它看起来像

if ( Arrays.sort(acctNumbers).find( number ) ) 

现在你必须这样做

List l = Arrays.sort(acctNumbers);
// decide on 
Arrays.binarySearch( l, number );

【讨论】:

    【解决方案2】:

    二分查找仅适用于is already sorted 的数组。

    引用自Arrays.binarySearchjavadoc:

    在指定的整数数组中搜索指定的值,使用 二分查找算法。数组必须排序(如 sort(int[]) 方法)在进行此调用之前。如果没有排序, 结果未定义。如果数组包含多个元素 使用指定的值,不能保证哪个是 找到了。

    如果它还没有排序,那么它不会找到一些数字。

    Sort it 在尝试任何二进制搜索之前:

    Arrays.sort(acctNumbers);
    

    【讨论】:

    • +1 以获得比我更完整的答案,并弥补对正确答案投反对票的巨魔。
    【解决方案3】:

    二分查找需要一个排序数组。

    你可以:

    【讨论】:

    • +1 以弥补对正确答案投反对票的投票者,并建议仅提供已排序的数组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多