mirror of
https://github.com/apache/commons-collections.git
synced 2025-02-17 15:35:00 +00:00
[COLLECTIONS-404] Added the option to provide an Equator to test for equality, by default a DefaultEquator is used that delegates to Object.equals().
git-svn-id: https://svn.apache.org/repos/asf/commons/proper/collections/trunk@1477512 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
4fa2b6e3ac
commit
44dc835e0a
@ -18,6 +18,9 @@ package org.apache.commons.collections4.sequence;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.apache.commons.collections4.functors.DefaultEquator;
|
||||||
|
import org.apache.commons.collections4.functors.Equator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class allows to compare two objects sequences.
|
* This class allows to compare two objects sequences.
|
||||||
* <p>
|
* <p>
|
||||||
@ -61,6 +64,9 @@ public class SequencesComparator<T> {
|
|||||||
/** Second sequence. */
|
/** Second sequence. */
|
||||||
private final List<T> sequence2;
|
private final List<T> sequence2;
|
||||||
|
|
||||||
|
/** The equator used for testing object equality. */
|
||||||
|
private final Equator<? super T> equator;
|
||||||
|
|
||||||
/** Temporary variables. */
|
/** Temporary variables. */
|
||||||
private final int[] vDown;
|
private final int[] vDown;
|
||||||
private final int[] vUp;
|
private final int[] vUp;
|
||||||
@ -68,7 +74,7 @@ public class SequencesComparator<T> {
|
|||||||
/**
|
/**
|
||||||
* Simple constructor.
|
* Simple constructor.
|
||||||
* <p>
|
* <p>
|
||||||
* Creates a new instance of SequencesComparator.
|
* Creates a new instance of SequencesComparator using a {@link DefaultEquator}.
|
||||||
* <p>
|
* <p>
|
||||||
* It is <em>guaranteed</em> that the comparisons will always be done as
|
* It is <em>guaranteed</em> that the comparisons will always be done as
|
||||||
* <code>o1.equals(o2)</code> where <code>o1</code> belongs to the first
|
* <code>o1.equals(o2)</code> where <code>o1</code> belongs to the first
|
||||||
@ -76,14 +82,30 @@ public class SequencesComparator<T> {
|
|||||||
* important if subclassing is used for some elements in the first sequence
|
* important if subclassing is used for some elements in the first sequence
|
||||||
* and the <code>equals</code> method is specialized.
|
* and the <code>equals</code> method is specialized.
|
||||||
*
|
*
|
||||||
* @param sequence1
|
* @param sequence1 first sequence to be compared
|
||||||
* first sequence to be compared
|
* @param sequence2 second sequence to be compared
|
||||||
* @param sequence2
|
|
||||||
* second sequence to be compared
|
|
||||||
*/
|
*/
|
||||||
public SequencesComparator(final List<T> sequence1, final List<T> sequence2) {
|
public SequencesComparator(final List<T> sequence1, final List<T> sequence2) {
|
||||||
|
this(sequence1, sequence2, DefaultEquator.defaultEquator());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple constructor.
|
||||||
|
* <p>
|
||||||
|
* Creates a new instance of SequencesComparator with a custom {@link Equator}.
|
||||||
|
* <p>
|
||||||
|
* It is <em>guaranteed</em> that the comparisons will always be done as
|
||||||
|
* <code>Equator.equate(o1, o2)</code> where <code>o1</code> belongs to the first
|
||||||
|
* sequence and <code>o2</code> belongs to the second sequence.
|
||||||
|
*
|
||||||
|
* @param sequence1 first sequence to be compared
|
||||||
|
* @param sequence2 second sequence to be compared
|
||||||
|
* @param equator the equator to use for testing object equality
|
||||||
|
*/
|
||||||
|
public SequencesComparator(final List<T> sequence1, final List<T> sequence2, final Equator<? super T> equator) {
|
||||||
this.sequence1 = sequence1;
|
this.sequence1 = sequence1;
|
||||||
this.sequence2 = sequence2;
|
this.sequence2 = sequence2;
|
||||||
|
this.equator = equator;
|
||||||
|
|
||||||
final int size = sequence1.size() + sequence2.size() + 2;
|
final int size = sequence1.size() + sequence2.size() + 2;
|
||||||
vDown = new int[size];
|
vDown = new int[size];
|
||||||
@ -122,7 +144,7 @@ public class SequencesComparator<T> {
|
|||||||
int end = start;
|
int end = start;
|
||||||
while (end - diag < end2
|
while (end - diag < end2
|
||||||
&& end < end1
|
&& end < end1
|
||||||
&& sequence1.get(end).equals(sequence2.get(end - diag))) {
|
&& equator.equate(sequence1.get(end), sequence2.get(end - diag))) {
|
||||||
++end;
|
++end;
|
||||||
}
|
}
|
||||||
return new Snake(start, end, diag);
|
return new Snake(start, end, diag);
|
||||||
@ -174,7 +196,7 @@ public class SequencesComparator<T> {
|
|||||||
int x = vDown[i];
|
int x = vDown[i];
|
||||||
int y = x - start1 + start2 - k;
|
int y = x - start1 + start2 - k;
|
||||||
|
|
||||||
while (x < end1 && y < end2 && sequence1.get(x).equals(sequence2.get(y))) {
|
while (x < end1 && y < end2 && equator.equate(sequence1.get(x), sequence2.get(y))) {
|
||||||
vDown[i] = ++x;
|
vDown[i] = ++x;
|
||||||
++y;
|
++y;
|
||||||
}
|
}
|
||||||
@ -200,7 +222,7 @@ public class SequencesComparator<T> {
|
|||||||
int x = vUp[i] - 1;
|
int x = vUp[i] - 1;
|
||||||
int y = x - start1 + start2 - k;
|
int y = x - start1 + start2 - k;
|
||||||
while (x >= start1 && y >= start2
|
while (x >= start1 && y >= start2
|
||||||
&& sequence1.get(x).equals(sequence2.get(y))) {
|
&& equator.equate(sequence1.get(x), sequence2.get(y))) {
|
||||||
vUp[i] = x--;
|
vUp[i] = x--;
|
||||||
y--;
|
y--;
|
||||||
}
|
}
|
||||||
@ -239,7 +261,7 @@ public class SequencesComparator<T> {
|
|||||||
int i = start1;
|
int i = start1;
|
||||||
int j = start2;
|
int j = start2;
|
||||||
while (i < end1 || j < end2) {
|
while (i < end1 || j < end2) {
|
||||||
if (i < end1 && j < end2 && sequence1.get(i).equals(sequence2.get(j))) {
|
if (i < end1 && j < end2 && equator.equate(sequence1.get(i), sequence2.get(j))) {
|
||||||
script.append(new KeepCommand<T>(sequence1.get(i)));
|
script.append(new KeepCommand<T>(sequence1.get(i)));
|
||||||
++i;
|
++i;
|
||||||
++j;
|
++j;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user