On Wed, 16 Oct 2013 22:43:18 +0100, Sean Owen wrote:
No, it's the current implementation that is technically wrong. Pair.java defines equality as equality of both keys and values. Comparator orderings
are supposed to be consistent with equals() (
http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html). That is, two Pairs should be equal if and only if they compare to 0. If you only
compare keys in an ordering, you will compare to 0 for un-equal Pairs
sometimes.

In this case, it is just what we want: sort based on the keys (which are the "Double"s which must be sorted). A "Pair" is used only so that the value part
"follows" its key during the sort. Two equal keys must compare to 0.

So defining ordering just on keys can't match this definition.

This means you could start from different orderings of the same Pairs in a List, sort them, and not get the same result. It means that in theory some classes like TreeSet won't work with Pairs and the current Comparator. In
practice? who knows. I bet it doesn't matter for this use case.

Indeed it doesn't matter: in this case, pairs [1.5, 3] and [1.5, 7] can either
be sorted as
 [1.5, 3]
 [1.5, 7]
or
 [1.5, 7]
 [1.5, 3]
The only requirement is that they end up such that all the same keys are in
contiguous locations.

Consequently, the lexicographic comparator will definitely be slower since it
will needlessly spend time ordering the values.


I prefer correctness over speed as anyone would,

Anyone should, indeed.

and thought it was a
decent motivation for this addition -- hey, even CM is a customer for this
class, let alone external consumers.

If we exclude the above case, which other CM code is a customer?

I sense you don't want to commit it,

I question the correctness of the change in "sortInPlace" (with the above argument), and the immediate usefulness _for_ CM (since a user interested
in a pair functionality should probably use Lang's implementation).
You did not expose your use-cases so I cannot judge whether a user would
have reasons to prefer CM's implementation.

so I'd say let's just close the issue,
having committed the toString() and factory method called create(). Thanks
for that much, I didn't mean to take nearly this much time.

Neither did I; it is only testimony that there is more to maintainable code
than adding the code to the repository.


Regards,
Gilles


On Wed, Oct 16, 2013 at 10:26 PM, Gilles <gil...@harfang.homelinux.org>wrote:

Hmm, I now wonder whether it is at all correct to add the comparison of
values
in that case (and I start to wonder why the tests still pass).




---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org

Reply via email to