簡體   English   中英

為什么Collections.binarySearch給出錯誤的結果?

[英]Why is Collections.binarySearch giving wrong results?

我創建了一個列表,其中保存了一些字符串。 但是,當我在這個名單之內做的二進制搜索 ,它返回負值 ,而該項目是在列表中

到目前為止,當列表中的項目返回時,我的知識肯定值將返回。 但是對於某些項目,它返回負值,而對於某些項目,它返回正值。

碼:

@Test
public void hello()
{
//  List<String> arlst = new ArrayList<String>();
    List arlst = new ArrayList();
    arlst.add("TP");
    arlst.add("PROVIDES");
    arlst.add("QUALITY");
    arlst.add("TUTORIALS");
    arlst.add("Stop");
    arlst.add("StopP");
    for (Iterator<String> iterator = (Iterator<String>) arlst.iterator();
            iterator.hasNext();)
    {
        Object next = iterator.next();
        System.out.println("next : " + next + " >> Search result : "
            + Collections.binarySearch(arlst, next.toString()));
    }

}

輸出:

next : TP >> Search result : -7
next : PROVIDES >> Search result : -1
next : QUALITY >> Search result : 2
next : TUTORIALS >> Search result : -7
next : Stop >> Search result : 4
next : StopP >> Search result : 5

原因

由於您的List在調用該方法之前未排序,因此您會收到奇怪的值,但這是必需的 因此,請查看方法文檔

使用二進制搜索算法在指定列表中搜索指定對象。 在進行此調用之前必須根據列表元素的自然順序將其按升序排序(例如通過sort(List)方法)。 如果未排序 ,則結果不確定 如果列表包含等於指定對象的多個元素,則不能保證將找到哪個元素。


說明

為了了解該要求,您需要了解二進制搜索的工作方式。 這是一個小插圖:

二進制搜索圖

該算法查看中間的元素,並將其與要搜索的元素進行比較。 如果給定的針小於中間元素,它將繼續向左搜索,否則向右搜索。 現在將查看縮小范圍中間的元素,並重復此過程,直到找到該元素或無法再划分范圍。

如果元素沒有事先排序,則算法很可能會遍歷錯誤的方向 ,顯然找不到元素。


解決方法很明顯,對List排序:

Collections.sort(arlst);

請注意,您不應使用raw-types 因此,編寫List<String>而不是List 然后,您的類型轉換也會過時。

完成后,代碼可能看起來像

// Setup list
List<String> list = new ArrayList<>();
list.add("TP");
list.add("PROVIDES");
list.add("QUALITY");
list.add("TUTORIALS");
list.add("Stop");
list.add("StopP");

// Sort list
Collections.sort(list);

// Iterate all elements and use binary search
Iterator<String> iter = list.iterator();
while (iter.hasNext()) {
    String element = iter.next();
    System.out.println("element : " + element
        + " >> Search result : "
        + Collections.binarySearch(list, element));
}

必須對列表進行排序以在其上使用binarySearch。

在API規范中:

使用二進制搜索算法在指定列表中搜索指定對象。 在進行此調用之前,必須根據列表元素的自然順序將其按升序排序(例如通過sort(List)方法)。 如果未排序,則結果不確定 如果列表包含等於指定對象的多個元素,則不能保證將找到哪個元素

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM