MATH-990: improved in-place sorting by using a helper class instead of

the generic Pair class, in order to avoid boxing and unboxing
This commit is contained in:
Otmar Ertl 2015-08-22 11:42:04 +02:00
parent 0820703df0
commit 32c5f86125
2 changed files with 38 additions and 13 deletions

View File

@ -51,6 +51,9 @@ If the output is not quite correct, check for invisible trailing spaces!
</properties> </properties>
<body> <body>
<release version="3.6" date="XXXX-XX-XX" description=""> <release version="3.6" date="XXXX-XX-XX" description="">
<action dev="oertl" type="update" issue="MATH-990">
Improved performance of sort-in-place methods by avoiding boxing.
</action>
<action dev="erans" type="fix" issue="MATH-1261" due-to="Osamu Ikeuchi"> <action dev="erans" type="fix" issue="MATH-1261" due-to="Osamu Ikeuchi">
Avoid overflow in "Fraction" (multiplication or division by an int). Avoid overflow in "Fraction" (multiplication or division by an int).
</action> </action>

View File

@ -744,6 +744,28 @@ public class MathArrays {
return norm; return norm;
} }
/**
* A helper data structure holding a double and an integer value.
*/
private static class PairDoubleInteger {
private final double key;
private final int value;
public PairDoubleInteger(double key, int value) {
this.key = key;
this.value = value;
}
public double getKey() {
return key;
}
public int getValue() {
return value;
}
}
/** /**
* Sort an array in ascending order in place and perform the same reordering * Sort an array in ascending order in place and perform the same reordering
* of entries on other arrays. For example, if * of entries on other arrays. For example, if
@ -807,24 +829,24 @@ public class MathArrays {
} }
// Associate each abscissa "x[i]" with its index "i". // Associate each abscissa "x[i]" with its index "i".
final List<Pair<Double, Integer>> list final List<PairDoubleInteger> list
= new ArrayList<Pair<Double, Integer>>(len); = new ArrayList<PairDoubleInteger>(len);
for (int i = 0; i < len; i++) { for (int i = 0; i < len; i++) {
list.add(new Pair<Double, Integer>(x[i], i)); list.add(new PairDoubleInteger(x[i], i));
} }
// Create comparators for increasing and decreasing orders. // Create comparators for increasing and decreasing orders.
final Comparator<Pair<Double, Integer>> comp final Comparator<PairDoubleInteger> comp
= dir == MathArrays.OrderDirection.INCREASING ? = dir == MathArrays.OrderDirection.INCREASING ?
new Comparator<Pair<Double, Integer>>() { new Comparator<PairDoubleInteger>() {
public int compare(Pair<Double, Integer> o1, public int compare(PairDoubleInteger o1,
Pair<Double, Integer> o2) { PairDoubleInteger o2) {
return o1.getKey().compareTo(o2.getKey()); return Double.compare(o1.getKey(), o2.getKey());
} }
} : new Comparator<Pair<Double,Integer>>() { } : new Comparator<PairDoubleInteger>() {
public int compare(Pair<Double, Integer> o1, public int compare(PairDoubleInteger o1,
Pair<Double, Integer> o2) { PairDoubleInteger o2) {
return o2.getKey().compareTo(o1.getKey()); return Double.compare(o2.getKey(), o1.getKey());
} }
}; };
@ -836,7 +858,7 @@ public class MathArrays {
// Retrieve indices of original locations. // Retrieve indices of original locations.
final int[] indices = new int[len]; final int[] indices = new int[len];
for (int i = 0; i < len; i++) { for (int i = 0; i < len; i++) {
final Pair<Double, Integer> e = list.get(i); final PairDoubleInteger e = list.get(i);
x[i] = e.getKey(); x[i] = e.getKey();
indices[i] = e.getValue(); indices[i] = e.getValue();
} }