Java implementation of Alpha-numeric comparator
roger riggs
roger.riggs at oracle.com
Tue Dec 16 15:13:28 UTC 2014
Corrected the internal string example below to reflect the case intended.
On 12/16/2014 9:58 AM, roger riggs wrote:
> Hi Ivan,
>
> In which package/class do you propose to add the API to get the
> comparator?
>
> In java.time, comparators are returned from static methods in an
> interface.
> This allows lambda to be used for the implementation.
> For example, ChronoZonedDateTime.timeLineOrder
> <https://docs.oracle.com/javase/8/docs/api/java/time/chrono/ChronoZonedDateTime.html#timeLineOrder-->()[1]
>
> For example a static method could be added to CharSequence:
> public static int Comparator<CharSequence> alphaNumericComparator() ...
>
> In use it would be
> CharSequence.alphaNumericComparator().compare("012", "234");
>
> 2) Should there be any provision for number strings internal to the
> string with leading zeros.
> Should "123-abc-123-def-789" be equal to "0123-abc-0123-def-0789"?
>
> Roger
>
>
>
> [1]
> https://docs.oracle.com/javase/8/docs/api/java/time/chrono/ChronoZonedDateTime.html#timeLineOrder--
>
> On 12/16/2014 3:57 AM, Ivan Gerasimov wrote:
>> Got it, thanks!
>>
>> Please find the updated webrev at the same location:
>> http://cr.openjdk.java.net/~igerasim/XXXXXXX-AlphaNumeric/1/webrev/
>>
>> Sincerely yours,
>> Ivan
>>
>> On 16.12.2014 11:23, Remi Forax wrote:
>>>
>>> On 12/16/2014 09:13 AM, Ivan Gerasimov wrote:
>>>> Thanks Remi for the comments!
>>>>
>>>> As you and Roger suggested I only left a CharSequence variant of
>>>> the comparator.
>>>>
>>>> I also removed the custom Comparator<Character> altogether for now,
>>>> for the sake of simplicity.
>>>> I guess for the purpose of a sample Character.compare(ch1, ch2)
>>>> should be good enough.
>>>>
>>>> Here's the updated webrev:
>>>> http://cr.openjdk.java.net/~igerasim/XXXXXXX-AlphaNumeric/1/webrev/
>>>>
>>>> I'm not certain, why the comparator should be serializable.
>>>> Could you please elaborate on this?
>>>
>>> Yes, all public comparators in the JDK are serializable because
>>> otherwise people will not be able to serialize collections like
>>> TreeSet or ConcurrentSkipListSet that implement Serializable and
>>> take a comparator as an optional argument.
>>>
>>>
>>>>
>>>> Sincerely yours,
>>>> Ivan
>>>
>>> cheers,
>>> Rémi
>>>
>>>>
>>>> On 16.12.2014 2:39, Remi Forax wrote:
>>>>> Hi Ivan, hi Roger,
>>>>>
>>>>> Roger, the API already exists it's the interface Comparator.
>>>>>
>>>>> I agree with Roger that a comparator that use a CharSequence is
>>>>> better that the one that use a char array.
>>>>>
>>>>> The thing that worry me is the Comparator<Character> taken as
>>>>> parameter, it means that
>>>>> each time the method compare() is called on this comparator, the
>>>>> two arguments are boxed.
>>>>>
>>>>> Minor comment, to be included, I think that these comparators
>>>>> should be serializable
>>>>> and in my opinion the best way to do that is to use a lambda
>>>>> instead of a class.
>>>>>
>>>>> Rémi
>>>>>
>>>>> On 12/15/2014 11:31 PM, roger riggs wrote:
>>>>>> Hi Ivan,
>>>>>>
>>>>>> It does seem like a useful function, though I would have started
>>>>>> with the API,
>>>>>> not the implementation.
>>>>>>
>>>>>> Can it apply to CharSequence not only String and maybe skip the
>>>>>> separate char[] version, a char[] array can be wrapped to become
>>>>>> a CharSequence via CharBuffer.
>>>>>> Or a via a new static method to define a CharSequence from a char
>>>>>> array.
>>>>>>
>>>>>> $.02, Roger
>>>>>>
>>>>>> On 12/15/2014 5:53 AM, Ivan Gerasimov wrote:
>>>>>>> Hello everyone!
>>>>>>>
>>>>>>> In certain situations the preferred way of sorting strings is a
>>>>>>> combination of char-comparing sorting with numeric sorting,
>>>>>>> where applicable.
>>>>>>> List of strings sorted this way often look more natural to the
>>>>>>> human eyes:
>>>>>>> { "alpha",
>>>>>>> "java1",
>>>>>>> "java2",
>>>>>>> "java10",
>>>>>>> "zero" }
>>>>>>>
>>>>>>> Here's presented a sample implementation of the comparator,
>>>>>>> which supports this way of sorting.
>>>>>>> I placed it under src/sample directory.
>>>>>>>
>>>>>>> http://cr.openjdk.java.net/~igerasim/XXXXXXX-AlphaNumeric/0/webrev/
>>>>>>>
>>>>>>>
>>>>>>> MSDN provides the function StrCmpLogicalW(), which can be used
>>>>>>> for similar sort order.
>>>>>>> http://msdn.microsoft.com/en-us/library/windows/desktop/bb759947%28v=vs.85%29.aspx
>>>>>>>
>>>>>>>
>>>>>>> The differences are:
>>>>>>> - case-sensitivity (StrCmpLogicalW is case-insensitive);
>>>>>>> - treating leading zeroes;
>>>>>>> - more accurate handling of strings with big numbers, which
>>>>>>> cannot be converted to int/long.
>>>>>>>
>>>>>>> I guess this comparator may become particularly useful when
>>>>>>> we'll have 'java10' and update releases/build numbers > 99 in
>>>>>>> the lists :)
>>>>>>>
>>>>>>> I want to ask the community about how useful this comparator may
>>>>>>> be to you?
>>>>>>>
>>>>>>> Sincerely yours,
>>>>>>> Ivan
>>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>
>>>
>>>
>>>
>>
>
More information about the core-libs-dev
mailing list