summaryrefslogtreecommitdiff
path: root/org.fox.ttcomics
diff options
context:
space:
mode:
authorAndrew Dolgov <[email protected]>2014-10-18 01:01:41 +0400
committerAndrew Dolgov <[email protected]>2014-10-18 01:01:41 +0400
commit2153989e2ee00985e0a52077cd0109892e8f4b3e (patch)
tree76199f72fe4ed7425c9b34d916081f8f039e42f8 /org.fox.ttcomics
parent00e3e12579c6f1235f0c6da296b396f0d2c3cf61 (diff)
add natural order sorting for pages
Diffstat (limited to 'org.fox.ttcomics')
-rw-r--r--org.fox.ttcomics/src/main/AndroidManifest.xml4
-rw-r--r--org.fox.ttcomics/src/main/java/org/fox/ttcomics/CbzComicArchive.java8
-rw-r--r--org.fox.ttcomics/src/main/java/org/fox/ttcomics/NaturalOrderComparator.java188
3 files changed, 195 insertions, 5 deletions
diff --git a/org.fox.ttcomics/src/main/AndroidManifest.xml b/org.fox.ttcomics/src/main/AndroidManifest.xml
index fed525e..b9c8ca0 100644
--- a/org.fox.ttcomics/src/main/AndroidManifest.xml
+++ b/org.fox.ttcomics/src/main/AndroidManifest.xml
@@ -1,7 +1,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.fox.ttcomics"
- android:versionCode="50"
- android:versionName="1.14" >
+ android:versionCode="51"
+ android:versionName="1.15" >
<uses-sdk
android:minSdkVersion="8"
diff --git a/org.fox.ttcomics/src/main/java/org/fox/ttcomics/CbzComicArchive.java b/org.fox.ttcomics/src/main/java/org/fox/ttcomics/CbzComicArchive.java
index 5e5b54f..43bacb2 100644
--- a/org.fox.ttcomics/src/main/java/org/fox/ttcomics/CbzComicArchive.java
+++ b/org.fox.ttcomics/src/main/java/org/fox/ttcomics/CbzComicArchive.java
@@ -38,12 +38,14 @@ public class CbzComicArchive extends ComicArchive {
m_count++;
}
}
-
- Collections.sort(m_entries, new Comparator<ZipEntry>() {
+
+ Collections.sort(m_entries, new NaturalOrderComparator());
+
+ /* Collections.sort(m_entries, new Comparator<ZipEntry>() {
public int compare(ZipEntry a, ZipEntry b) {
return a.getName().compareTo(b.getName());
}
- });
+ }); */
}
diff --git a/org.fox.ttcomics/src/main/java/org/fox/ttcomics/NaturalOrderComparator.java b/org.fox.ttcomics/src/main/java/org/fox/ttcomics/NaturalOrderComparator.java
new file mode 100644
index 0000000..49a8a85
--- /dev/null
+++ b/org.fox.ttcomics/src/main/java/org/fox/ttcomics/NaturalOrderComparator.java
@@ -0,0 +1,188 @@
+package org.fox.ttcomics;
+
+/*
+ NaturalOrderComparator.java -- Perform 'natural order' comparisons of strings in Java.
+ Copyright (C) 2003 by Pierre-Luc Paour <[email protected]>
+
+ Based on the C version by Martin Pool, of which this is more or less a straight conversion.
+ Copyright (C) 2000 by Martin Pool <[email protected]>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+ */
+
+import java.util.*;
+
+public class NaturalOrderComparator implements Comparator
+{
+ int compareRight(String a, String b)
+ {
+ int bias = 0;
+ int ia = 0;
+ int 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
+ // both numbers to know that they have the same magnitude, so we
+ // remember it in BIAS.
+ for (;; ia++, ib++)
+ {
+ char ca = charAt(a, ia);
+ char cb = charAt(b, ib);
+
+ if (!Character.isDigit(ca) && !Character.isDigit(cb))
+ {
+ return bias;
+ }
+ else if (!Character.isDigit(ca))
+ {
+ return -1;
+ }
+ else if (!Character.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(Object o1, Object o2)
+ {
+ String a = o1.toString();
+ String b = o2.toString();
+
+ 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
+ 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')
+ {
+ nza++;
+ }
+ else
+ {
+ // only count consecutive zeroes
+ nza = 0;
+ }
+
+ ca = charAt(a, ++ia);
+ }
+
+ while (Character.isSpaceChar(cb) || cb == '0')
+ {
+ if (cb == '0')
+ {
+ nzb++;
+ }
+ 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;
+ }
+ }
+
+ 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)
+ {
+ return -1;
+ }
+ else if (ca > cb)
+ {
+ return +1;
+ }
+
+ ++ia;
+ ++ib;
+ }
+ }
+
+ static char charAt(String s, int i)
+ {
+ if (i >= s.length())
+ {
+ return 0;
+ }
+ else
+ {
+ return 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" };
+
+ List orig = Arrays.asList(strings);
+
+ System.out.println("Original: " + orig);
+
+ List scrambled = Arrays.asList(strings);
+ Collections.shuffle(scrambled);
+
+ System.out.println("Scrambled: " + scrambled);
+
+ Collections.sort(scrambled, new NaturalOrderComparator());
+
+ System.out.println("Sorted: " + scrambled);
+ }
+} \ No newline at end of file