ich eine Klasse haben, und die Liste der Instanzen, die (die Unschuldigen/proprietäre zu schützen geändert Feldnamen) etwa wie folgt aussieht:einen Komparator für eine Verbindung Objekt für binäre Such Schreiben
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;
Die Liste bloatList
wird intern von BloatProducer
gehalten und wird so verwaltet, dass es nur neue Bloat
Datensätze anfügt, keine der alten ändert und jedes der Felder monoton ansteigt, z bloatProducer.testMonotonicity()
würde immer true
zurückgeben.
Ich möchte Collections.binarySearch(list,key,comparator)
verwenden, um nach dem Bloat
Datensatz entweder in den Feldern timeInMilliseconds, spaceInBytes oder costInPennies zu suchen. (und wenn die Zahl zwischen zwei Datensätzen liegt, möchte ich den vorherigen Datensatz finden)
Was ist der einfachste Weg, eine Reihe von 3 Comparator-Klassen zu schreiben, um dies zu erreichen? Muss ich einen Schlüssel verwenden, der ein Bloat-Objekt mit Dummy-Feldern für diejenigen ist, nach denen ich nicht suche?
binarysearch nur Werke Wenn die Sammlung sortiert ist, bedeutet dies, dass eine neue Sammlung um die vorhandene Liste gewickelt wird, die so sortiert ist, wie Sie benötigen. Wenn Ihre Sammlung sehr groß ist, benötigen Sie eine andere Suchmethode. Natürlich kann die Sammlung Verweise auf das gleiche Objekt haben, so groß ist möglicherweise nicht so schlimm wie Sie denken. – Yishai
ist es nach allen Feldern sortiert, die mir wichtig sind, so bin ich in Glück –
Betrachtet ein SQL-Server im Speicher? Es würde Ihnen Indexierungsfähigkeit zusammen mit Einfügungen und so geben. – akarnokd