2017-11-08 2 views
1

Ich bin neu in Java und ich versuche zu verstehen, wie dieser Algorithmus funktioniert und wie ich es implementieren kann, so dass es meine ArrayList sortiert.Verwenden des AlphanumComparator

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(" "))); 
} 

Zur Zeit habe ich eine Liste, die C1 enthält, C10, C11, C2, C3, C4, C5, C6, C7, C8, C9, aber ich mag es bestellen es als: C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11

Ich bin nicht ganz verstehen, wie man diesen Algorithmus verwendet, indem Sie das Beispiel betrachten. Ich würde wirklich etwas Hilfe schätzen!

Danke!

Antwort

0
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); 
} 
+0

Vielen Dank! :) – jaewhyun