java - 使用 AlphanumComparator

标签 java comparator alphanumeric

我是 Java 新手,我正在尝试了解该算法的工作原理以及如何实现它,以便它对我的 ArrayList 进行排序。

http://www.davekoelle.com/files/AlphanumComparator.java

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

/**
 * This is an updated version with enhancements made by Daniel Migowski,
 * Andre Bogus, and David Koelle. Updated by David Koelle in 2017.
 *
 * To use this class:
 *   Use the static "sort" method from the java.util.Collections class:
 *   Collections.sort(your list, new AlphanumComparator());
 */
public class AlphanumComparator implements Comparator<String>
{
   private final boolean isDigit(char ch)
{
    return ((ch >= 48) && (ch <= 57));
}

/** Length of string is passed in for improved efficiency (only need to calculate it once) **/
private final String getChunk(String s, int slength, int marker)
{
    StringBuilder chunk = new StringBuilder();
    char c = s.charAt(marker);
    chunk.append(c);
    marker++;
    if (isDigit(c))
    {
        while (marker < slength)
        {
            c = s.charAt(marker);
            if (!isDigit(c))
                break;
            chunk.append(c);
            marker++;
        }
    } else
    {
        while (marker < slength)
        {
            c = s.charAt(marker);
            if (isDigit(c))
                break;
            chunk.append(c);
            marker++;
        }
    }
    return chunk.toString();
}

public int compare(String s1, String s2)
{
    if ((s1 == null) || (s2 == null)) 
    {
        return 0;
    }

    int thisMarker = 0;
    int thatMarker = 0;
    int s1Length = s1.length();
    int s2Length = s2.length();

    while (thisMarker < s1Length && thatMarker < s2Length)
    {
        String thisChunk = getChunk(s1, s1Length, thisMarker);
        thisMarker += thisChunk.length();

        String thatChunk = getChunk(s2, s2Length, thatMarker);
        thatMarker += thatChunk.length();

        // If both chunks contain numeric characters, sort them numerically
        int result = 0;
        if (isDigit(thisChunk.charAt(0)) && isDigit(thatChunk.charAt(0)))
        {
            // Simple chunk comparison by length.
            int thisChunkLength = thisChunk.length();
            result = thisChunkLength - thatChunk.length();
            // If equal, the first different number counts
            if (result == 0)
            {
                for (int i = 0; i < thisChunkLength; i++)
                {
                    result = thisChunk.charAt(i) - thatChunk.charAt(i);
                    if (result != 0)
                    {
                        return result;
                    }
                }
            }
        } 
        else
        {
            result = thisChunk.compareTo(thatChunk);
        }

        if (result != 0)
            return result;
    }

    return s1Length - s2Length;
}

/** 
 * Shows an example of how the comparator works. 
 * Feel free to delete this in your own code!
 */
public static void main(String[] args) {
    List<String> values = Arrays.asList("dazzle2", "dazzle10", "dazzle1", "dazzle2.7", "dazzle2.10", "2", "10", "1", "EctoMorph6", "EctoMorph62", "EctoMorph7");
    System.out.println(values.stream().sorted(new AlphanumComparator()).collect(Collectors.joining(" ")));
}

目前我有一个列表,其中包含 C1、C10、C11、C2、C3、C4、C5、C6、C7、C8、C9、 但我希望将其排序为: C1、C2、C3、C4、C5、C6、C7、C8、C9、C10、C11

通过查看提供的示例,我不太了解如何使用该算法。我真的很感激一些帮助!

谢谢!

最佳答案

public static void main(String[] args) {
    List<String> values = Arrays.asList("C1", "C10", "C11", "C2", "C3", "C4", "C5", "C6", "C7", "C8", "C9");
    List<String> sorted = values.stream().sorted(new AlphanumComparator()).collect(Collectors.toList());
    System.out.println(sorted);
}

关于java - 使用 AlphanumComparator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47170839/

相关文章:

java - 尝试对空对象引用调用虚拟方法 SupportMapFragment getMapAsync

java - iText - PdfPTable RowSpan 使用 mytable.writeSelectedRows

Java.util.scanner 似乎只读取某些行

java - 排序算法 - 如何在 main :) 中实现我的类

Java TreeMap(比较器)和忽略比较器的get方法

objective-c - 在 Cocoa 中生成一个随机的字母数字字符串

java - 我如何强制方法的实现在 Java 中的 try-catch block 中?

java - 以自定义顺序根据其属性对对象的数组列表进行排序

具有字母数字顺序的 MySQL 查询

python - 如何在 pandas 数据框中的列中填充字母数字系列?