问题
我想在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);
答案 0 :(得分:5)
当您在列表中运行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;
}
}
个对象Klant
和o1
,如果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。)