Ich habe eine Liste von Intervallen mit ganzzahligen Werten [z. [1, 4], [10, 19] usw.]. Gibt es eine Möglichkeit, diese Intervalle in einige Container von Java-Sammlungen zu legen [z. Setzen Sie] so, dass ich eine 'Union'-Funktion für den Container aufrufen kann. Die 'Union'-Funktion sollte mir eine Liste von Intervallen geben, so dass, wenn zwei eingefügte Intervalle sich überlappen, sie in der Ausgabe zusammengeführt werden sollten. Ich habe versucht, die Range-Klasse in Guava zu verwenden, aber habe alle Intervalle vor dem Zusammenführen verglichen. Ein eleganter Ansatz dazu wäre sehr geschätzt! Hier ist, was ich versucht habe, basierend auf der Antwort unten. Die Ausgabe ist [[1, 15], [17, 20]], was korrekt ist. Ich wollte wissen, ob es eine aufregende API gibt, die so etwas implementiert.Intervall in Java eingestellt
public static void main(String[] args) {
// mock data
List<MyIntRange> rng_lst = new ArrayList<Junk.MyIntRange>();
rng_lst.add(new MyIntRange(1, 10));
rng_lst.add(new MyIntRange(5, 15));
rng_lst.add(new MyIntRange(17, 20));
// sort intervals by start position
Collections.sort(rng_lst);
// merge the intervals which overlap
List<MyIntRange> res_lst = new ArrayList<Junk.MyIntRange>();
MyIntRange old_rng = null;
for (MyIntRange cur_rng : rng_lst) {
if (old_rng == null) {
old_rng = cur_rng;
} else {
if (old_rng.rng.upperEndpoint() < cur_rng.rng.lowerEndpoint()) {
// this does not over lap with the next one
res_lst.add(old_rng);
old_rng = cur_rng;
} else {
// overlap
old_rng = new MyIntRange(old_rng.rng.lowerEndpoint(),
cur_rng.rng.upperEndpoint());
}
}
}
// add the last range
res_lst.add(old_rng);
// done!
System.out.println(res_lst);
}
// wrapper around Guava's Range to make it comparable based on the
// interval's start
public static class MyIntRange implements Comparable<MyIntRange> {
Range<Integer> rng;
public MyIntRange(int start, int end) {
rng = Ranges.closed(start, end);
}
public int compareTo(MyIntRange that) {
int res = -1;
if (this.rng.lowerEndpoint() > that.rng.lowerEndpoint()) {
res = 1;
}
return res;
}
public String toString() {
return "[" + rng.lowerEndpoint() + ", " + rng.upperEndpoint() + "]";
}
}
dank
Ja, es gibt eine Möglichkeit zu tun, was Sie tun möchten. [Was haben Sie versucht?] (Http://whathaveyoutried.com) –
@ user1998031 Wenn [9,13] und [10,15] dann, was ist das Ergebnis, das Sie erwarten? –
Ähnlich wie [diese Frage] (http://stackoverflow.com/questions/4648261/is-there-an-indexset-and-a-range-class-for-java)? – prunge