Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.Comparator;
- import java.util.List;
- public class HumanReadableSorter
- {
- private static final Comparator<String> HUMAN_READABLE_SORTER
- = new Comparator<String>()
- {
- public int compare(String s1, String s2)
- {
- return sortToHumanReadableForm(s1, s2);
- }
- };
- public static void main(String[] args)
- {
- List<String> tmp = new ArrayList<String>();
- tmp.add("1");
- tmp.add("2");
- tmp.add("a12");
- tmp.add("a13");
- tmp.add("a113");
- tmp.add("2");
- tmp.add("dfas");
- tmp.add("dfas12");
- tmp.add("dfas1");
- tmp.add("df12ad");
- tmp.add("df122d");
- HumanReadableSorter.sort(tmp);
- for(String s : tmp)
- {
- System.out.println(s);
- }
- }
- public static void sort(List<String> list)
- {
- Collections.sort(list, HUMAN_READABLE_SORTER);
- }
- private static int sortToHumanReadableForm(String first, String second)
- {
- int lenghtToCompare=0;
- if (first.length() > second.length())
- {
- lenghtToCompare = second.length();
- }
- else
- {
- lenghtToCompare = first.length();
- }
- int i =0;
- boolean previousDigit = false;
- while(i < lenghtToCompare)
- {
- if(first.charAt(i) == second.charAt(i))
- {
- if(Character.isDigit(first.charAt(i)))
- {
- previousDigit = true;
- }
- i++;
- continue;
- }
- boolean isDigitFirst = Character.isDigit(first.charAt(i));
- boolean isDigitSecond = Character.isDigit(second.charAt(i));
- if(isDigitFirst && isDigitSecond)
- {
- Long firstNumber = parseLong(first, i);
- Long secondNumber = parseLong(second, i);
- if(firstNumber > secondNumber)
- {
- return 1;
- }
- else if(firstNumber < secondNumber)
- {
- return -1;
- }
- else
- {
- i += firstNumber.toString().length();
- continue;
- }
- }
- if(previousDigit)
- {
- if(isDigitFirst)
- {
- return 1;
- }
- else if(isDigitSecond)
- {
- return -1;
- }
- previousDigit = false;
- }
- if(first.charAt(i) > second.charAt(i))
- {
- return 1;
- }
- else if(first.charAt(i) < second.charAt(i))
- {
- return -1;
- }
- ++i;
- }
- if(first.length() > second.length())
- {
- return 1;
- }
- else if(first.length() < second.length())
- {
- return -1;
- }
- return 0;
- }
- private static Long parseLong(String value, int startingPosition)
- {
- StringBuffer buffer = new StringBuffer();
- buffer.append(value.charAt(startingPosition));
- for(int i = (startingPosition + 1); i < value.length(); ++i)
- {
- if(Character.isDigit(value.charAt(i)))
- {
- buffer.append(value.charAt(i));
- }
- }
- return Long.parseLong(buffer.toString());
- }
- }
Add Comment
Please, Sign In to add comment