Skip to content

Commit

Permalink
Merge pull request #5 from kstenschke/master
Browse files Browse the repository at this point in the history
Updated NaturalOrderComparator.java
  • Loading branch information
paour authored Mar 28, 2017
2 parents 6cd9997 + 65bd9f4 commit ab9e2df
Showing 1 changed file with 35 additions and 66 deletions.
101 changes: 35 additions & 66 deletions NaturalOrderComparator.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,7 @@ public class NaturalOrderComparator implements Comparator
{
int compareRight(String a, String b)
{
int bias = 0;
int ia = 0;
int ib = 0;
int bias = 0, ia = 0, ib = 0;

// The longest run of digits wins. That aside, the greatest
// value wins, but we can't know that it will until we've scanned
Expand All @@ -41,33 +39,25 @@ int compareRight(String a, String b)
char ca = charAt(a, ia);
char cb = charAt(b, ib);

if (!Character.isDigit(ca) && !Character.isDigit(cb))
{
if (!Character.isDigit(ca) && !Character.isDigit(cb)) {
return bias;
}
if (!Character.isDigit(ca))
{
if (!Character.isDigit(ca)) {
return -1;
}
if (!Character.isDigit(cb))
{
if (!Character.isDigit(cb)) {
return +1;
}
if (ca < cb)
{
if (bias == 0)
{
bias = -1;
}
if (ca == 0 && cb == 0) {
return bias;
}
else if (ca > cb)
{
if (bias == 0)

if (bias == 0) {
if (ca < cb) {
bias = -1;
} else if (ca > cb) {
bias = +1;
}
else if (ca == 0 && cb == 0)
{
return bias;
}
}
}
}
Expand All @@ -80,69 +70,54 @@ public int compare(Object o1, Object o2)
int ia = 0, ib = 0;
int nza = 0, nzb = 0;
char ca, cb;
int result;

while (true)
{
// only count the number of zeroes leading the last number compared
while (true) {
// Only count the number of zeroes leading the last number compared
nza = nzb = 0;

ca = charAt(a, ia);
cb = charAt(b, ib);

// skip over leading spaces or zeros
while (Character.isSpaceChar(ca) || ca == '0')
{
if (ca == '0')
{
while (Character.isSpaceChar(ca) || ca == '0') {
if (ca == '0') {
nza++;
}
else
{
// only count consecutive zeroes
} else {
// Only count consecutive zeroes
nza = 0;
}

ca = charAt(a, ++ia);
}

while (Character.isSpaceChar(cb) || cb == '0')
{
if (cb == '0')
{
while (Character.isSpaceChar(cb) || cb == '0') {
if (cb == '0') {
nzb++;
}
else
{
// only count consecutive zeroes
} else {
// Only count consecutive zeroes
nzb = 0;
}

cb = charAt(b, ++ib);
}

// process run of digits
if (Character.isDigit(ca) && Character.isDigit(cb))
{
if ((result = compareRight(a.substring(ia), b.substring(ib))) != 0)
{
return result;
// Process run of digits
if (Character.isDigit(ca) && Character.isDigit(cb)) {
int bias = compareRight(a.substring(ia), b.substring(ib));
if (bias != 0) {
return bias;
}
}

if (ca == 0 && cb == 0)
{
if (ca == 0 && cb == 0) {
// The strings compare the same. Perhaps the caller
// will want to call strcmp to break the tie.
return nza - nzb;
}

if (ca < cb)
{
if (ca < cb) {
return -1;
}
if (ca > cb)
{
if (ca > cb) {
return +1;
}

Expand All @@ -151,22 +126,16 @@ public int compare(Object o1, Object o2)
}
}

static char charAt(String s, int i)
{
if (i >= s.length())
{
return 0;
}

return s.charAt(i);
static char charAt(String s, int i) {
return i >= s.length() ? 0 : s.charAt(i);
}

public static void main(String[] args)
{
String[] strings = new String[] { "1-2", "1-02", "1-20", "10-20", "fred", "jane", "pic01",
"pic2", "pic02", "pic02a", "pic3", "pic4", "pic 4 else", "pic 5", "pic05", "pic 5",
"pic 5 something", "pic 6", "pic 7", "pic100", "pic100a", "pic120", "pic121",
"pic02000", "tom", "x2-g8", "x2-y7", "x2-y08", "x8-y8" };
"pic2", "pic02", "pic02a", "pic3", "pic4", "pic 4 else", "pic 5", "pic05", "pic 5",
"pic 5 something", "pic 6", "pic 7", "pic100", "pic100a", "pic120", "pic121",
"pic02000", "tom", "x2-g8", "x2-y7", "x2-y08", "x8-y8" };

List orig = Arrays.asList(strings);

Expand Down

0 comments on commit ab9e2df

Please sign in to comment.