Я просто пытаюсь использовать собственный Java-бинарный поиск, надеясь, что он всегда найдет первое вхождение. Но это не всегда возвращает первое вхождение, что я сделал здесь неправильно?
import java.util.*;
class BinarySearchWithComparator
{
  public static void main(String[] args)
  {
    // Please scroll down to see 'User' class implementation.
    List<User> l = new ArrayList<User>();
    l.add(new User(10, "A"));
    l.add(new User(10, "A"));
    l.add(new User(10, "A"));
    l.add(new User(20, "B"));
    l.add(new User(20, "B"));
    l.add(new User(20, "B"));
    l.add(new User(20, "B"));
    l.add(new User(20, "B"));
    l.add(new User(20, "B"));
    l.add(new User(20, "B"));
    l.add(new User(30, "C"));
    l.add(new User(30, "C"));
    l.add(new User(30, "C"));
    l.add(new User(30, "C"));
    Comparator<User> c = new Comparator<User>() {
      public int compare(User u1, User u2) {
        return u1.getId().compareTo(u2.getId());
      }
    };
    // Must pass in an object of type 'User' as the key.
    // The key is an 'User' with the 'id' which is been searched for.
    // The 'name' field is not used in the comparison for the binary search,
    // so it can be a dummy value -- here it is omitted with a null.
    //
    // Also note that the List must be sorted before running binarySearch,
    // in this case, the list is already sorted.
    Collections.sort(l,c);
    int index = Collections.binarySearch(l, new User(10, null), c);
    System.out.println(index);
    index = Collections.binarySearch(l, new User(20, null), c);
    System.out.println(index);
    index = Collections.binarySearch(l, new User(30, null), c);
    System.out.println(index);
    index = Collections.binarySearch(l, new User(42, null), c);
    System.out.println(index);
  }
}
class User {
  private int id;
  private String name;
  public User(int id, String name) {
    this.id = id;
    this.name = name;
  }
  public Integer getId() {
    return Integer.valueOf(id);
  }
}
========
Result:
2 //not 0 ?
6 //not 3?
10 //ok
-15  ok
Why first 10 is not index 0 ?
Why first 20 is not index 3 ?
OK , 30 first occurrence is index 10
======================================
Update
Теперь кажется, что API не так уж и garante! Может ли кто-нибудь дать мне рабочий пример того, как найти первое вхождение и последнее вхождение для данного элемента (например, User (10, null)?
Большое спасибо.
