Hi Loic, first of all, I like this proposal. Thank you for that!
Regarding your question I see two options: - implement compare so that is accepts CharSequences as well. That would mean to implement a compare for CharSequences which compares two sequences character by character - exclude the compare methods Benedikt 2015-10-05 15:32 GMT+02:00 Loic Guibert <lfdummy-apa...@yahoo.fr>: > But i've a problem in this unit test : > > org.apache.commons.lang3.StringUtilsTest.testStringUtilsCharSequenceContract() > > It said : > > The method public static int > org.apache.commons.lang3.StringUtils.compare(String,String,boolean) appears > to be immutable in spirit and therefore must not accept a String > > I use String parameters instead of CharSequence because in the Java > conception, only String are Comparable and not CharSequence. > I call String#compareTo(String) in the implementation. > > So what should I do ? > > Loic Guibert > PGP : 0x65EB4F33 > > > > Le 05/10/2015 17:19, Loic Guibert a écrit : > > Hello, > > I've implemented null safe methods to compare 2 Strings in StringUtils : > > - public static int compare(final String str1, final String str2); > > - public static int compare(final String str1, final String str2, > > final boolean nullIsLess); > > - public static int compareIgnoreCase(final String str1, final String > > str2); > > - public static int compareIgnoreCase(final String str1, final String > > str2, final boolean nullIsLess); > > > > > > I opened a JIRA ticket and an associated Pull Request to add those > > methods in StringUtils : > > - https://issues.apache.org/jira/browse/LANG-1171 > > - https://github.com/apache/commons-lang/pull/110 > > > > > > More details : > > /** > > * <p>Compare two Strings lexicographically, as per {@link > > String#compareTo(String)}, returning :</p> > > * <ul> > > * <li>{@code int = 0}, if {@code str1} is equal to {@code str2} (or > > both {@code null})</li> > > * <li>{@code int < 0}, if {@code str1} is less than {@code str2}</li> > > * <li>{@code int > 0}, if {@code str1} is greater than {@code > str2}</li> > > * </ul> > > * > > * <p>This is a {@code null} safe version of :</p> > > * <blockquote><pre>str1.compareTo(str2)</pre></blockquote> > > * > > * <p>{@code null} value is considered less than non-{@code null} value. > > * Two {@code null} references are considered equal.</p> > > * > > * <pre> > > * StringUtils.compare(null, null) = 0 > > * StringUtils.compare(null , "a") < 0 > > * StringUtils.compare("a", null) > 0 > > * StringUtils.compare("abc", "abc") = 0 > > * StringUtils.compare("a", "b") < 0 > > * StringUtils.compare("b", "a") > 0 > > * StringUtils.compare("a", "B") > 0 > > * StringUtils.compare("ab", "abc") < 0 > > * </pre> > > * > > * @see #compare(String, String, boolean) > > * @see String#compareTo(String) > > * @param str1 the String to compare from > > * @param str2 the String to compare to > > * @return < 0, 0, > 0, if {@code str1} is respectively less, > > equal ou greater than {@code str2} > > */ > > public static int compare(final String str1, final String str2); > > > > /** > > * <p>Compare two Strings lexicographically, as per {@link > > String#compareTo(String)}, returning :</p> > > * <ul> > > * <li>{@code int = 0}, if {@code str1} is equal to {@code str2} (or > > both {@code null})</li> > > * <li>{@code int < 0}, if {@code str1} is less than {@code str2}</li> > > * <li>{@code int > 0}, if {@code str1} is greater than {@code > str2}</li> > > * </ul> > > * > > * <p>This is a {@code null} safe version of :</p> > > * <blockquote><pre>str1.compareTo(str2)</pre></blockquote> > > * > > * <p>{@code null} inputs are handled according to the {@code > > nullIsLess} parameter. > > * Two {@code null} references are considered equal.</p> > > * > > * <pre> > > * StringUtils.compare(null, null, *) = 0 > > * StringUtils.compare(null , "a", true) < 0 > > * StringUtils.compare(null , "a", false) > 0 > > * StringUtils.compare("a", null, true) > 0 > > * StringUtils.compare("a", null, false) < 0 > > * StringUtils.compare("abc", "abc", *) = 0 > > * StringUtils.compare("a", "b", *) < 0 > > * StringUtils.compare("b", "a", *) > 0 > > * StringUtils.compare("a", "B", *) > 0 > > * StringUtils.compare("ab", "abc", *) < 0 > > * </pre> > > * > > * @see String#compareTo(String) > > * @param str1 the String to compare from > > * @param str2 the String to compare to > > * @param nullIsLess whether consider {@code null} value less than > > non-{@code null} value > > * @return < 0, 0, > 0, if {@code str1} is respectively less, > > equal ou greater than {@code str2} > > */ > > public static int compare(final String str1, final String str2, final > > boolean nullIsLess); > > > > /** > > * <p>Compare two Strings lexicographically, ignoring case differences, > > * as per {@link String#compareToIgnoreCase(String)}, returning :</p> > > * <ul> > > * <li>{@code int = 0}, if {@code str1} is equal to {@code str2} (or > > both {@code null})</li> > > * <li>{@code int < 0}, if {@code str1} is less than {@code str2}</li> > > * <li>{@code int > 0}, if {@code str1} is greater than {@code > str2}</li> > > * </ul> > > * > > * <p>This is a {@code null} safe version of :</p> > > * <blockquote><pre>str1.compareToIgnoreCase(str2)</pre></blockquote> > > * > > * <p>{@code null} value is considered less than non-{@code null} value. > > * Two {@code null} references are considered equal. > > * Comparison is case insensitive.</p> > > * > > * <pre> > > * StringUtils.compareIgnoreCase(null, null) = 0 > > * StringUtils.compareIgnoreCase(null , "a") < 0 > > * StringUtils.compareIgnoreCase("a", null) > 0 > > * StringUtils.compareIgnoreCase("abc", "abc") = 0 > > * StringUtils.compareIgnoreCase("abc", "ABC") = 0 > > * StringUtils.compareIgnoreCase("a", "b") < 0 > > * StringUtils.compareIgnoreCase("b", "a") > 0 > > * StringUtils.compareIgnoreCase("a", "B") < 0 > > * StringUtils.compareIgnoreCase("A", "b") < 0 > > * StringUtils.compareIgnoreCase("ab", "ABC") < 0 > > * </pre> > > * > > * @see #compareIgnoreCase(String, String, boolean) > > * @see String#compareToIgnoreCase(String) > > * @param str1 the String to compare from > > * @param str2 the String to compare to > > * @return < 0, 0, > 0, if {@code str1} is respectively less, > > equal ou greater than {@code str2}, > > * ignoring case differences. > > */ > > public static int compareIgnoreCase(final String str1, final String > str2); > > > > /** > > * <p>Compare two Strings lexicographically, ignoring case differences, > > * as per {@link String#compareToIgnoreCase(String)}, returning :</p> > > * <ul> > > * <li>{@code int = 0}, if {@code str1} is equal to {@code str2} (or > > both {@code null})</li> > > * <li>{@code int < 0}, if {@code str1} is less than {@code str2}</li> > > * <li>{@code int > 0}, if {@code str1} is greater than {@code > str2}</li> > > * </ul> > > * > > * <p>This is a {@code null} safe version of :</p> > > * <blockquote><pre>str1.compareToIgnoreCase(str2)</pre></blockquote> > > * > > * <p>{@code null} inputs are handled according to the {@code > > nullIsLess} parameter. > > * Two {@code null} references are considered equal. > > * Comparison is case insensitive.</p> > > * > > * <pre> > > * StringUtils.compareIgnoreCase(null, null, *) = 0 > > * StringUtils.compareIgnoreCase(null , "a", true) < 0 > > * StringUtils.compareIgnoreCase(null , "a", false) > 0 > > * StringUtils.compareIgnoreCase("a", null, true) > 0 > > * StringUtils.compareIgnoreCase("a", null, false) < 0 > > * StringUtils.compareIgnoreCase("abc", "abc", *) = 0 > > * StringUtils.compareIgnoreCase("abc", "ABC", *) = 0 > > * StringUtils.compareIgnoreCase("a", "b", *) < 0 > > * StringUtils.compareIgnoreCase("b", "a", *) > 0 > > * StringUtils.compareIgnoreCase("a", "B", *) < 0 > > * StringUtils.compareIgnoreCase("A", "b", *) < 0 > > * StringUtils.compareIgnoreCase("ab", "abc", *) < 0 > > * </pre> > > * > > * @see String#compareToIgnoreCase(String) > > * @param str1 the String to compare from > > * @param str2 the String to compare to > > * @param nullIsLess whether consider {@code null} value less than > > non-{@code null} value > > * @return < 0, 0, > 0, if {@code str1} is respectively less, > > equal ou greater than {@code str2}, > > * ignoring case differences. > > */ > > public static int compareIgnoreCase(final String str1, final String > > str2, final boolean nullIsLess); > > > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org > For additional commands, e-mail: dev-h...@commons.apache.org > > -- http://people.apache.org/~britter/ http://www.systemoutprintln.de/ http://twitter.com/BenediktRitter http://github.com/britter