ArrayList BinarySearch

时间:2014-12-09 09:41:58

标签: java binary-search

问题

我想在Klant的对象上自己实现BinarySearch方法我该怎么做? Klant有一些变数。

public class Klant {
public String klantID;
private String voornaam;
private String tussenvoegsel;
private String achternaam;
private int leeftijd;
private static boolean MAN = true;
private String plaats;
private String email;
/*
 *  Getters and setters included 
 */
}

Klant toevoeging = new Klant("FirstName", "middleName", "\Lastname\"", 20, false, "Location", "email@email.com");
klanten.add(toevoeging);

2 个答案:

答案 0 :(得分:5)

使用Collections.binarySearch(...)

当您在列表中运行Collections.binarySearch(...);时,该列表中的对象必须implement Comparable,否则您必须将Comparator传递给{{1}方法;

使用比较器作为示例,您可以执行以下操作;

binarySearch(...)

在上文中,您比较了class KlantComparator implements Comparator<Klant> { @Override public int compare(Klant o1, Klant o2) { if(condition) return 1; else if(condition2) return 0; else return -1; } } 个对象Klanto1,如果o2的排名应高于o1则返回1,如果他们返回0则返回0是相同的,如果o2排名低于o1,则返回-1。然后运行二进制搜索;

o2

在上面请注意 KlantComparator kc = new KlantComparator(); ArrayList klants = new ArrayList<Klant>(); Klant o = new Klant(); klants.add(o); klants.add(new Klant()); klants.add(new Klant()); Collections.sort(klants, kc); Collections.binarySearch(klants, o, kc); 集合需要先排序,并且需要使用对列表排序的klants执行binarySearch。

我希望这会有所帮助。

进一步阅读;

答案 1 :(得分:2)

既然你想自己实现它,Collections.binearySearch对你来说不够好吗?

好的....

Bineary Search:

您有已排序列表。获取中间的元素并与相关对象进行比较。如果 比您要查找的元素更低,请在列表中仅包含更高元素的部分重复搜索。如果更高,请在列表部分中搜索仅较低元素。

那你怎么做直线搜索?

您需要一个度量,它为2个对象定义较低的一个和较高的一个。

您的对象必须实施Comparable ,您必须为列表定义Comparator

然后你需要对列表进行实际排序。排序将是Collections.sort(myList)

Now List有size()方法,可帮助您确定第一个“中间”元素。

伪代码:

 **input** : keyElement

 startIndex = 0;
 endIndex = list.size();

 midIndex = (endIndex+startIndex) / 2;
 while(list.get(midIndex) !=  keyElement) {
     if (list.get(midIndex) < keyElement) {
         startIndex = midIndex;
     } else {
         endIndex = midIndex;
     }
     midIndex = (endIndex+startIndex) / 2;
 }

 return midIndex;

沿着这些方向的东西(在这里有边界...可能需要+/- 1。)