package com.sequenceiq.cloudbreak.cloud.model; import static java.lang.Character.isDigit; import static java.lang.Character.isSpaceChar; import java.util.Comparator; import com.sequenceiq.cloudbreak.cloud.model.generic.StringType; public class StringTypesCompare implements Comparator<StringType> { int compareRight(String a, String b) { int bias = 0; int ia = 0; int ib = 0; for (;; ia++, ib++) { char ca = charAt(a, ia); char cb = charAt(b, ib); if (!isDigit(ca) && !isDigit(cb)) { return bias; } else if (!isDigit(ca)) { return -1; } else if (!isDigit(cb)) { return +1; } else if (ca < cb) { if (bias == 0) { bias = -1; } } else if (ca > cb) { if (bias == 0) { bias = +1; } } else if (ca == 0 && cb == 0) { return bias; } } } public int compare(StringType o1, StringType o2) { String a = o1.value(); String b = o2.value(); int ia = 0; int ib = 0; int nza; int nzb; char ca; char cb; int result; while (true) { nza = 0; nzb = 0; ca = charAt(a, ia); cb = charAt(b, ib); while (isSpaceChar(ca) || ca == '0') { if (ca == '0') { nza++; } else { nza = 0; } ca = charAt(a, ++ia); } while (isSpaceChar(cb) || cb == '0') { if (cb == '0') { nzb++; } else { nzb = 0; } cb = charAt(b, ++ib); } if (isDigit(ca) && isDigit(cb)) { result = compareRight(a.substring(ia), b.substring(ib)); if (result != 0) { return result; } } if (ca == 0 && cb == 0) { return nza - nzb; } if (ca < cb) { return -1; } else if (ca > cb) { return +1; } ++ia; ++ib; } } char charAt(String s, int i) { if (i >= s.length()) { return 0; } else { return s.charAt(i); } } }