Java-äquivalent zu c++ equal_range (oder lower_bound & upper_bound)
Ich habe eine Liste von Objekten sortiert und ich auf der Suche nach dem ersten auftreten und dem letzten vorkommen eines Objekts an. In C++ kann ich problemlos verwenden std::equal_range (oder nur einen lower_bound und eine upper_bound).
Beispiel:
bool mygreater (int i,int j) { return (i>j); }
int main () {
int myints[] = {10,20,30,30,20,10,10,20};
std::vector<int> v(myints,myints+8); //10 20 30 30 20 10 10 20
std::pair<std::vector<int>::iterator,std::vector<int>::iterator> bounds;
//using default comparison:
std::sort (v.begin(), v.end()); //10 10 10 20 20 20 30 30
bounds=std::equal_range (v.begin(), v.end(), 20); // ^ ^
//using "mygreater" as comp:
std::sort (v.begin(), v.end(), mygreater); //30 30 20 20 20 10 10 10
bounds=std::equal_range (v.begin(), v.end(), 20, mygreater); // ^ ^
std::cout << "bounds at positions " << (bounds.first - v.begin());
std::cout << " and " << (bounds.second - v.begin()) << '\n';
return 0;
}
In Java, scheint es keine einfache äquivalenz? Wie soll ich mit der gleichen range mit
List<MyClass> myList;
Übrigens, ich bin mit einem standard-import von java.util.Liste;
- Für diejenigen von uns, die sprechen nicht "C", können Sie beschreiben, was Sie wollen in Englisch mit Beispielen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
In Java verwenden Sie
Sammlungen.binarysearch-Methode
zu finden, die untere Grenze der gleiche Bereich in einer sortierten Liste (Arrays.binarySearch
bietet eine ähnliche Funktion für arrays). Dann sind Sie weiterhin Linear Durchlaufen, bis Sie auf dem Ende des equal-range.Funktionieren diese Methoden bei den Methoden der Umsetzung der
Vergleichbar
- Schnittstelle. Für Klassen, die implementiert nicht dieComparable
können Sie liefern eine Instanz einer benutzerdefinierteComparator
für den Vergleich der Elemente des bestimmten Typs.Können Sie versuchen, so etwas wie dieses:
}
In binäre Suche , wenn Sie finden, das element, dann Sie können halten Sie tun binäre Suche auf der linken Seite, um zu finden, die ersten vorkommen und nach rechts, um zum letzten element.
Die Idee sollte klar sein mit dem code:
mid=(low+high)/2
Linie. Es kann overflow: googleresearch.blogspot.mx/2006/06/...Dies ist die Umsetzung für lower_bound und upper_bound ähnlich zu c++.
Beachten Sie, dass das element, das Sie suchen, brauchen sich nicht in der Vektor oder Liste. Diese Implementierung gibt nur das element der oberen und unteren Schranken.
Nur binäre Suche