我有一个类和实例列表,看起来像这样(字段名称已更改以保护无辜/专有):
public class Bloat
{
public long timeInMilliseconds;
public long spaceInBytes;
public long costInPennies;
}
public class BloatProducer
{
final private List<Bloat> bloatList = new ArrayList<Bloat>();
final private Random random = new Random();
public void produceMoreBloat()
{
int n = bloatList.size();
Bloat previousBloat = (n == 0) ? new Bloat() : bloatList.get(n-1);
Bloat newBloat = new Bloat();
newBloat.timeInMilliseconds =
previousBloat.timeInMilliseconds + random.nextInt(10) + 1;
newBloat.spaceInBytes =
previousBloat.spaceInBytes + random.nextInt(10) + 1;
newBloat.costInPennies =
previousBloat.costInPennies + random.nextInt(10) + 1;
bloatList.add(newBloat);
}
/* other fields/methods */
public boolean testMonotonicity()
{
Bloat previousBloat = null;
for (Bloat thisBloat : bloatList)
{
if (previousBloat != null)
{
if ((previousBloat.timeInMilliseconds
>= thisBloat.timeInMilliseconds)
|| (previousBloat.spaceInBytes
>= thisBloat.spaceInBytes)
|| (previousBloat.costInPennies
>= thisBloat.costInPennies))
return false;
}
previousBloat = thisBloat;
}
return true;
}
BloatProducer bloatProducer;
列表bloatList
由内部保存BloatProducer
并以仅附加新内容的方式进行维护Bloat
记录,不修改任何旧的记录,并且每个字段都是单调递增的,例如bloatProducer.testMonotonicity()
总会回来true
.
我想用Collections.binarySearch(list,key,comparator)
来搜索Bloat
按时间(以毫秒为单位)、空间(以字节为单位)或 costInPennies 字段进行记录。 (如果数字在两条记录之间,我想找到上一条记录)
编写一系列 3 个 Comparator 类以使其正常工作的最简单方法是什么?对于我不搜索的对象,我是否必须使用带有虚拟字段的 Bloat 对象键?
您需要为要比较的每个字段编写一个单独的比较器:
public class BloatTimeComparator implements Comparator<Bloat> {
public int compare(Bloat bloat1, Bloat bloat2) {
if (bloat1.timeInMilliseconds > bloat2.timeInMilliseconds) {
return 1;
} else if (bloat1.timeInMilliseconds < bloat2.timeInMilliseconds) {
return -1;
} else {
return 0;
}
}
}
等等对于每个属性Bloat
您想要比较(您需要为每个创建一个比较器类)。然后使用 Collections 辅助方法:
Collections.binarySearch(bloatList, bloatObjectToFind,
new BloatTimeComparator());
来自Java 文档 http://java.sun.com/javase/6/docs/api/对于binarySearch方法,返回值将是:
搜索关键字的索引(如果它包含在列表中);否则,(-(插入点) - 1)。插入点定义为将键插入到列表中的点:大于该键的第一个元素的索引,或者如果列表中的所有元素都小于指定键,则为 list.size() 。请注意,这保证了当且仅当找到键时返回值>= 0。
这是您指定的所需索引。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)