Skip to content

Commit

Permalink
Use the '+1/-1' way to implement the min and max operators
Browse files Browse the repository at this point in the history
  • Loading branch information
zsxwing committed Nov 11, 2013
1 parent 75b2ddd commit db04d56
Show file tree
Hide file tree
Showing 6 changed files with 431 additions and 498 deletions.
23 changes: 13 additions & 10 deletions rxjava-core/src/main/java/rx/Observable.java
Original file line number Diff line number Diff line change
Expand Up @@ -53,10 +53,9 @@
import rx.operators.OperationLast;
import rx.operators.OperationMap;
import rx.operators.OperationMaterialize;
import rx.operators.OperationMax;
import rx.operators.OperationMerge;
import rx.operators.OperationMergeDelayError;
import rx.operators.OperationMin;
import rx.operators.OperationMinMax;
import rx.operators.OperationMulticast;
import rx.operators.OperationObserveOn;
import rx.operators.OperationOnErrorResumeNextViaFunction;
Expand Down Expand Up @@ -3636,6 +3635,7 @@ public static Observable<Double> averageDoubles(Observable<Double> source) {

/**
* Returns the minimum element in an observable sequence.
* If there are more than one minimum elements, returns the last one.
* For an empty source, it causes an {@link IllegalArgumentException}.
*
* @param source
Expand All @@ -3646,11 +3646,12 @@ public static Observable<Double> averageDoubles(Observable<Double> source) {
* @see <a href="http://msdn.microsoft.com/en-us/library/hh229715(v=vs.103).aspx">MSDN: Observable.Min</a>
*/
public static <T extends Comparable<T>> Observable<T> min(Observable<T> source) {
return OperationMin.min(source);
return OperationMinMax.min(source);
}

/**
* Returns the minimum element in an observable sequence according to the specified comparator.
* If there are more than one minimum elements, returns the last one.
* For an empty source, it causes an {@link IllegalArgumentException}.
*
* @param comparator
Expand All @@ -3661,7 +3662,7 @@ public static <T extends Comparable<T>> Observable<T> min(Observable<T> source)
* @see <a href="http://msdn.microsoft.com/en-us/library/hh229095(v=vs.103).aspx">MSDN: Observable.Min</a>
*/
public Observable<T> min(Comparator<T> comparator) {
return OperationMin.min(this, comparator);
return OperationMinMax.min(this, comparator);
}

/**
Expand All @@ -3674,7 +3675,7 @@ public Observable<T> min(Comparator<T> comparator) {
* @see <a href="http://msdn.microsoft.com/en-us/library/hh228970(v=vs.103).aspx">MSDN: Observable.MinBy</a>
*/
public <R extends Comparable<R>> Observable<List<T>> minBy(Func1<T, R> selector) {
return OperationMin.minBy(this, selector);
return OperationMinMax.minBy(this, selector);
}

/**
Expand All @@ -3689,11 +3690,12 @@ public <R extends Comparable<R>> Observable<List<T>> minBy(Func1<T, R> selector)
* @see <a href="http://msdn.microsoft.com/en-us/library/hh228970(v=vs.103).aspx">MSDN: Observable.MinBy</a>
*/
public <R> Observable<List<T>> minBy(Func1<T, R> selector, Comparator<R> comparator) {
return OperationMin.minBy(this, selector, comparator);
return OperationMinMax.minBy(this, selector, comparator);
}

/**
* Returns the maximum element in an observable sequence.
* If there are more than one maximum elements, returns the last one.
* For an empty source, it causes an {@link IllegalArgumentException}.
*
* @param source
Expand All @@ -3704,11 +3706,12 @@ public <R> Observable<List<T>> minBy(Func1<T, R> selector, Comparator<R> compara
* @see <a href="http://msdn.microsoft.com/en-us/library/hh211837(v=vs.103).aspx">MSDN: Observable.Max</a>
*/
public static <T extends Comparable<T>> Observable<T> max(Observable<T> source) {
return OperationMax.max(source);
return OperationMinMax.max(source);
}

/**
* Returns the maximum element in an observable sequence according to the specified comparator.
* If there are more than one maximum elements, returns the last one.
* For an empty source, it causes an {@link IllegalArgumentException}.
*
* @param comparator
Expand All @@ -3719,7 +3722,7 @@ public static <T extends Comparable<T>> Observable<T> max(Observable<T> source)
* @see <a href="http://msdn.microsoft.com/en-us/library/hh211635(v=vs.103).aspx">MSDN: Observable.Max</a>
*/
public Observable<T> max(Comparator<T> comparator) {
return OperationMax.max(this, comparator);
return OperationMinMax.max(this, comparator);
}

/**
Expand All @@ -3732,7 +3735,7 @@ public Observable<T> max(Comparator<T> comparator) {
* @see <a href="http://msdn.microsoft.com/en-us/library/hh229058(v=vs.103).aspx">MSDN: Observable.MaxBy</a>
*/
public <R extends Comparable<R>> Observable<List<T>> maxBy(Func1<T, R> selector) {
return OperationMax.maxBy(this, selector);
return OperationMinMax.maxBy(this, selector);
}

/**
Expand All @@ -3747,7 +3750,7 @@ public <R extends Comparable<R>> Observable<List<T>> maxBy(Func1<T, R> selector)
* @see <a href="http://msdn.microsoft.com/en-us/library/hh244330(v=vs.103).aspx">MSDN: Observable.MaxBy</a>
*/
public <R> Observable<List<T>> maxBy(Func1<T, R> selector, Comparator<R> comparator) {
return OperationMax.maxBy(this, selector, comparator);
return OperationMinMax.maxBy(this, selector, comparator);
}

/**
Expand Down
106 changes: 0 additions & 106 deletions rxjava-core/src/main/java/rx/operators/OperationMax.java

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -26,36 +26,76 @@
/**
* Returns the minimum element in an observable sequence.
*/
public class OperationMin {
public class OperationMinMax {

public static <T extends Comparable<T>> Observable<T> min(
Observable<T> source) {
return minMax(source, -1L);
}

public static <T> Observable<T> min(Observable<T> source,
final Comparator<T> comparator) {
return minMax(source, comparator, -1L);
}

public static <T, R extends Comparable<R>> Observable<List<T>> minBy(
Observable<T> source, final Func1<T, R> selector) {
return minMaxBy(source, selector, -1L);
}

public static <T, R> Observable<List<T>> minBy(Observable<T> source,
final Func1<T, R> selector, final Comparator<R> comparator) {
return minMaxBy(source, selector, comparator, -1L);
}

public static <T extends Comparable<T>> Observable<T> max(
Observable<T> source) {
return minMax(source, 1L);
}

public static <T> Observable<T> max(Observable<T> source,
final Comparator<T> comparator) {
return minMax(source, comparator, 1L);
}

public static <T, R extends Comparable<R>> Observable<List<T>> maxBy(
Observable<T> source, final Func1<T, R> selector) {
return minMaxBy(source, selector, 1L);
}

public static <T, R> Observable<List<T>> maxBy(Observable<T> source,
final Func1<T, R> selector, final Comparator<R> comparator) {
return minMaxBy(source, selector, comparator, 1L);
}

private static <T extends Comparable<T>> Observable<T> minMax(
Observable<T> source, final long flag) {
return source.reduce(new Func2<T, T, T>() {
@Override
public T call(T acc, T value) {
if (acc.compareTo(value) < 0) {
if (flag * acc.compareTo(value) > 0) {
return acc;
}
return value;
}
});
}

public static <T> Observable<T> min(Observable<T> source,
final Comparator<T> comparator) {
private static <T> Observable<T> minMax(Observable<T> source,
final Comparator<T> comparator, final long flag) {
return source.reduce(new Func2<T, T, T>() {
@Override
public T call(T acc, T value) {
if (comparator.compare(acc, value) < 0) {
if (flag * comparator.compare(acc, value) > 0) {
return acc;
}
return value;
}
});
}

public static <T, R extends Comparable<R>> Observable<List<T>> minBy(
Observable<T> source, final Func1<T, R> selector) {
private static <T, R extends Comparable<R>> Observable<List<T>> minMaxBy(
Observable<T> source, final Func1<T, R> selector, final long flag) {
return source.reduce(new ArrayList<T>(),
new Func2<List<T>, T, List<T>>() {

Expand All @@ -64,12 +104,12 @@ public List<T> call(List<T> acc, T value) {
if (acc.isEmpty()) {
acc.add(value);
} else {
int flag = selector.call(acc.get(0)).compareTo(
selector.call(value));
if (flag > 0) {
acc.clear();
int compareResult = selector.call(acc.get(0))
.compareTo(selector.call(value));
if (compareResult == 0) {
acc.add(value);
} else if (flag == 0) {
} else if (flag * compareResult < 0) {
acc.clear();
acc.add(value);
}
}
Expand All @@ -78,8 +118,9 @@ public List<T> call(List<T> acc, T value) {
});
}

public static <T, R> Observable<List<T>> minBy(Observable<T> source,
final Func1<T, R> selector, final Comparator<R> comparator) {
private static <T, R> Observable<List<T>> minMaxBy(Observable<T> source,
final Func1<T, R> selector, final Comparator<R> comparator,
final long flag) {
return source.reduce(new ArrayList<T>(),
new Func2<List<T>, T, List<T>>() {

Expand All @@ -88,13 +129,13 @@ public List<T> call(List<T> acc, T value) {
if (acc.isEmpty()) {
acc.add(value);
} else {
int flag = comparator.compare(
int compareResult = comparator.compare(
selector.call(acc.get(0)),
selector.call(value));
if (flag > 0) {
acc.clear();
if (compareResult == 0) {
acc.add(value);
} else if (flag == 0) {
} else if (flag * compareResult < 0) {
acc.clear();
acc.add(value);
}
}
Expand Down
Loading

0 comments on commit db04d56

Please sign in to comment.