Guest User

Untitled

a guest
Dec 11th, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.77 KB | None | 0 0
  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.Comparator;
  4. import java.util.List;
  5.  
  6.  
  7. public class HumanReadableSorter
  8. {  
  9.     private static final Comparator<String> HUMAN_READABLE_SORTER
  10.         = new Comparator<String>()
  11.         {
  12.         public int compare(String s1, String s2)
  13.         {
  14.             return sortToHumanReadableForm(s1, s2);
  15.         }
  16.     };
  17.  
  18.     public static void main(String[] args)
  19.     {
  20.         List<String> tmp = new ArrayList<String>();
  21.         tmp.add("1");
  22.         tmp.add("2");
  23.         tmp.add("a12");
  24.         tmp.add("a13");
  25.         tmp.add("a113");
  26.         tmp.add("2");
  27.         tmp.add("dfas");
  28.         tmp.add("dfas12");
  29.         tmp.add("dfas1");
  30.         tmp.add("df12ad");
  31.         tmp.add("df122d");     
  32.                
  33.        
  34.         HumanReadableSorter.sort(tmp);
  35.        
  36.         for(String s : tmp)
  37.         {
  38.             System.out.println(s);
  39.         }
  40.     }
  41.    
  42.     public static void sort(List<String> list)
  43.     {
  44.         Collections.sort(list, HUMAN_READABLE_SORTER);
  45.     }
  46.  
  47.     private static int sortToHumanReadableForm(String first, String second)
  48.     {      
  49.         int lenghtToCompare=0;
  50.  
  51.         if (first.length() > second.length())
  52.         {
  53.             lenghtToCompare = second.length();
  54.         }
  55.         else
  56.         {
  57.             lenghtToCompare = first.length();
  58.         }
  59.        
  60.         int i =0;
  61.         boolean previousDigit = false;
  62.        
  63.         while(i < lenghtToCompare)
  64.         {
  65.             if(first.charAt(i) == second.charAt(i))
  66.             {
  67.                 if(Character.isDigit(first.charAt(i)))
  68.                 {
  69.                     previousDigit = true;
  70.                 }
  71.                
  72.                 i++;
  73.                 continue;
  74.             }
  75.            
  76.             boolean isDigitFirst = Character.isDigit(first.charAt(i));
  77.             boolean isDigitSecond = Character.isDigit(second.charAt(i));
  78.            
  79.             if(isDigitFirst && isDigitSecond)
  80.             {
  81.                 Long firstNumber = parseLong(first, i);
  82.                 Long secondNumber = parseLong(second, i);
  83.                
  84.                 if(firstNumber > secondNumber)
  85.                 {
  86.                     return 1;
  87.                 }
  88.                 else if(firstNumber < secondNumber)
  89.                 {
  90.                     return -1;
  91.                 }
  92.                 else
  93.                 {
  94.                     i += firstNumber.toString().length();
  95.                     continue;
  96.                 }
  97.             }
  98.            
  99.             if(previousDigit)
  100.             {
  101.                 if(isDigitFirst)
  102.                 {
  103.                     return 1;
  104.                 }
  105.                 else if(isDigitSecond)
  106.                 {
  107.                     return -1;
  108.                 }
  109.                
  110.                 previousDigit = false;
  111.             }
  112.            
  113.             if(first.charAt(i) > second.charAt(i))
  114.             {
  115.                 return 1;
  116.             }
  117.             else if(first.charAt(i) < second.charAt(i))
  118.             {
  119.                 return -1;
  120.             }
  121.             ++i;
  122.         }
  123.        
  124.         if(first.length() > second.length())
  125.         {
  126.             return 1;
  127.         }
  128.         else if(first.length() < second.length())
  129.         {
  130.             return -1;
  131.         }
  132.        
  133.         return 0;
  134.     }
  135.    
  136.     private static Long parseLong(String value, int startingPosition)
  137.     {
  138.         StringBuffer buffer = new StringBuffer();
  139.         buffer.append(value.charAt(startingPosition));
  140.        
  141.         for(int i = (startingPosition + 1); i < value.length(); ++i)
  142.         {
  143.             if(Character.isDigit(value.charAt(i)))
  144.             {
  145.                 buffer.append(value.charAt(i));
  146.             }
  147.         }
  148.        
  149.         return Long.parseLong(buffer.toString());
  150.     }
  151. }
Add Comment
Please, Sign In to add comment