Java 使用AlphanumComparator
我是Java新手,我试图了解这个算法是如何工作的,以及如何实现它,以便它对我的ArrayList进行排序Java 使用AlphanumComparator,java,comparator,alphanumeric,Java,Comparator,Alphanumeric,我是Java新手,我试图了解这个算法是如何工作的,以及如何实现它,以便它对我的ArrayList进行排序 导入java.util.array; 导入java.util.Comparator; 导入java.util.List; 导入java.util.stream.collector; /** *这是由Daniel Migowski改进的更新版本, *安德烈·博格斯和大卫·科勒。由David Koelle于2017年更新。 * *要使用此类,请执行以下操作: *使用java.util.Coll
导入java.util.array;
导入java.util.Comparator;
导入java.util.List;
导入java.util.stream.collector;
/**
*这是由Daniel Migowski改进的更新版本,
*安德烈·博格斯和大卫·科勒。由David Koelle于2017年更新。
*
*要使用此类,请执行以下操作:
*使用java.util.Collections类中的静态“sort”方法:
*排序(您的列表,新的AlphanumComparator());
*/
公共类AlphanumComparator实现比较器
{
专用最终布尔值isDigit(字符ch)
{
返回((ch>=48)&(chpublicstaticvoidmain(String[]args){
列表值=数组。asList(“C1”、“C10”、“C11”、“C2”、“C3”、“C4”、“C5”、“C6”、“C7”、“C8”、“C9”);
List sorted=values.stream().sorted(新AlphanumComparator()).collect(collector.toList());
系统输出打印项次(已排序);
}
公共静态void main(字符串[]args){
列表值=数组。asList(“C1”、“C10”、“C11”、“C2”、“C3”、“C4”、“C5”、“C6”、“C7”、“C8”、“C9”);
List sorted=values.stream().sorted(新AlphanumComparator()).collect(collector.toList());
系统输出打印项次(已排序);
}
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(" ")));
}
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);
}