Browse Source

Sort torrents by name using natural order (Book 8 comes before Book 10).

pull/11/head
Eric Kok 12 years ago
parent
commit
b7cac50561
  1. BIN
      core/libs/transdroid-connect.jar
  2. 107
      lib/src/org/transdroid/daemon/AlphanumComparator.java
  3. 14
      lib/src/org/transdroid/daemon/DummyAdapter.java
  4. 9
      lib/src/org/transdroid/daemon/TorrentsComparator.java

BIN
core/libs/transdroid-connect.jar

Binary file not shown.

107
lib/src/org/transdroid/daemon/AlphanumComparator.java

@ -0,0 +1,107 @@
package org.transdroid.daemon;
/*
* The Alphanum Algorithm is an improved sorting algorithm for strings
* containing numbers. Instead of sorting numbers in ASCII order like
* a standard sort, this algorithm sorts numbers in numeric order.
*
* The Alphanum Algorithm is discussed at http://www.DaveKoelle.com
*
* This is an updated version with enhancements made by Daniel Migowski,
* Andre Bogus, and David Koelle
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import java.util.Comparator;
public class AlphanumComparator implements Comparator<String> {
private final boolean isDigit(char ch) {
return ch >= 48 && ch <= 57;
}
/** Length of string is passed in for improved efficiency (only need to calculate it once) **/
private final String getChunk(String s, int slength, int marker) {
StringBuilder chunk = new StringBuilder();
char c = s.charAt(marker);
chunk.append(c);
marker++;
if (isDigit(c)) {
while (marker < slength) {
c = s.charAt(marker);
if (!isDigit(c))
break;
chunk.append(c);
marker++;
}
} else {
while (marker < slength) {
c = s.charAt(marker);
if (isDigit(c))
break;
chunk.append(c);
marker++;
}
}
return chunk.toString();
}
public int compare(String o1, String o2) {
if (!(o1 instanceof String) || !(o2 instanceof String)) {
return 0;
}
String s1 = (String) o1;
String s2 = (String) o2;
int thisMarker = 0;
int thatMarker = 0;
int s1Length = s1.length();
int s2Length = s2.length();
while (thisMarker < s1Length && thatMarker < s2Length) {
String thisChunk = getChunk(s1, s1Length, thisMarker);
thisMarker += thisChunk.length();
String thatChunk = getChunk(s2, s2Length, thatMarker);
thatMarker += thatChunk.length();
// If both chunks contain numeric characters, sort them numerically
int result = 0;
if (isDigit(thisChunk.charAt(0)) && isDigit(thatChunk.charAt(0))) {
// Simple chunk comparison by length.
int thisChunkLength = thisChunk.length();
result = thisChunkLength - thatChunk.length();
// If equal, the first different number counts
if (result == 0) {
for (int i = 0; i < thisChunkLength; i++) {
result = thisChunk.charAt(i) - thatChunk.charAt(i);
if (result != 0) {
return result;
}
}
}
} else {
result = thisChunk.compareTo(thatChunk);
}
if (result != 0)
return result;
}
return s1Length - s2Length;
}
}

14
lib/src/org/transdroid/daemon/DummyAdapter.java

@ -75,7 +75,9 @@ public class DummyAdapter implements IDaemonAdapter {
this.dummyLabels = new ArrayList<Label>(); this.dummyLabels = new ArrayList<Label>();
String[] names = new String[] { "Documentary ", "Book ", "CD Image ", "Mix tape ", "App " }; String[] names = new String[] { "Documentary ", "Book ", "CD Image ", "Mix tape ", "App " };
String[] labels = new String[] { "docs", "books", "isos", "music", "software" }; String[] labels = new String[] { "docs", "books", "isos", "music", "software" };
TorrentStatus[] statuses = new TorrentStatus[] { TorrentStatus.Seeding, TorrentStatus.Downloading, TorrentStatus.Paused, TorrentStatus.Queued, TorrentStatus.Downloading, TorrentStatus.Seeding, TorrentStatus.Error }; TorrentStatus[] statuses = new TorrentStatus[] { TorrentStatus.Seeding, TorrentStatus.Downloading,
TorrentStatus.Paused, TorrentStatus.Queued, TorrentStatus.Downloading, TorrentStatus.Seeding,
TorrentStatus.Error };
Random random = new Random(); Random random = new Random();
for (int i = 1; i < 26; i++) { for (int i = 1; i < 26; i++) {
String name = names[i % names.length] + Integer.toString(i); String name = names[i % names.length] + Integer.toString(i);
@ -86,8 +88,8 @@ public class DummyAdapter implements IDaemonAdapter {
long left = status == TorrentStatus.Downloading ? (long) (size * random.nextDouble()) : 0; long left = status == TorrentStatus.Downloading ? (long) (size * random.nextDouble()) : 0;
int rateDownload = status == TorrentStatus.Downloading ? (int) (1024D * 100D * i * random.nextDouble()) int rateDownload = status == TorrentStatus.Downloading ? (int) (1024D * 100D * i * random.nextDouble())
: 0; : 0;
int rateUpload = status == TorrentStatus.Downloading || status == TorrentStatus.Seeding ? (int) (1024D * 1024D * i * random int rateUpload = status == TorrentStatus.Downloading || status == TorrentStatus.Seeding ?
.nextDouble()) : 0; (int) (1024D * 100D * i * random.nextDouble()) : 0;
this.dummyTorrents.add( this.dummyTorrents.add(
new Torrent( new Torrent(
i, i,
@ -140,7 +142,8 @@ public class DummyAdapter implements IDaemonAdapter {
Torrent t = task.getTargetTorrent(); Torrent t = task.getTargetTorrent();
List<TorrentFile> dummyFiles = new ArrayList<TorrentFile>(); List<TorrentFile> dummyFiles = new ArrayList<TorrentFile>();
Priority priorities[] = new Priority[] { Priority.Normal, Priority.Normal, Priority.High, Priority.Low, Priority.Normal }; Priority priorities[] = new Priority[] { Priority.Normal, Priority.Normal, Priority.High, Priority.Low,
Priority.Normal };
for (int i = 1; i < 16; i++) { for (int i = 1; i < 16; i++) {
String fileName = "file_" + i + ".ext"; String fileName = "file_" + i + ".ext";
// Every file has equal part in the total size // Every file has equal part in the total size
@ -154,7 +157,8 @@ public class DummyAdapter implements IDaemonAdapter {
case GetStats: case GetStats:
return new GetStatsTaskSuccessResult((GetStatsTask) task, alternativeModeEnabled, 1024L * 1024L * 1024L * 100); return new GetStatsTaskSuccessResult((GetStatsTask) task, alternativeModeEnabled, 1024L * 1024L *
1024L * 100);
case AddByFile: case AddByFile:

9
lib/src/org/transdroid/daemon/TorrentsComparator.java

@ -28,8 +28,9 @@ import java.util.Comparator;
*/ */
public class TorrentsComparator implements Comparator<Torrent> { public class TorrentsComparator implements Comparator<Torrent> {
TorrentsSortBy sortBy; private TorrentsSortBy sortBy;
boolean reversed; private boolean reversed;
private Comparator<String> alphanumComparator = new AlphanumComparator();
/** /**
* Instantiate a torrents comparator. The daemon type is used to check support for comparing on the set property. If * Instantiate a torrents comparator. The daemon type is used to check support for comparing on the set property. If
@ -66,7 +67,7 @@ public class TorrentsComparator implements Comparator<Torrent> {
case Ratio: case Ratio:
return new Double(tor1.getRatio()).compareTo(new Double(tor2.getRatio())); return new Double(tor1.getRatio()).compareTo(new Double(tor2.getRatio()));
default: default:
return tor1.getName().toLowerCase().compareTo(tor2.getName().toLowerCase()); return alphanumComparator.compare(tor1.getName(), tor2.getName());
} }
} else { } else {
switch (sortBy) { switch (sortBy) {
@ -81,7 +82,7 @@ public class TorrentsComparator implements Comparator<Torrent> {
case Ratio: case Ratio:
return 0 - new Double(tor1.getRatio()).compareTo(new Double(tor2.getRatio())); return 0 - new Double(tor1.getRatio()).compareTo(new Double(tor2.getRatio()));
default: default:
return 0 - tor1.getName().toLowerCase().compareTo(tor2.getName().toLowerCase()); return 0 - alphanumComparator.compare(tor1.getName(), tor2.getName());
} }
} }
} }

Loading…
Cancel
Save