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

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

@ -28,8 +28,9 @@ import java.util.Comparator; @@ -28,8 +28,9 @@ import java.util.Comparator;
*/
public class TorrentsComparator implements Comparator<Torrent> {
TorrentsSortBy sortBy;
boolean reversed;
private TorrentsSortBy sortBy;
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
@ -66,7 +67,7 @@ public class TorrentsComparator implements Comparator<Torrent> { @@ -66,7 +67,7 @@ public class TorrentsComparator implements Comparator<Torrent> {
case Ratio:
return new Double(tor1.getRatio()).compareTo(new Double(tor2.getRatio()));
default:
return tor1.getName().toLowerCase().compareTo(tor2.getName().toLowerCase());
return alphanumComparator.compare(tor1.getName(), tor2.getName());
}
} else {
switch (sortBy) {
@ -81,7 +82,7 @@ public class TorrentsComparator implements Comparator<Torrent> { @@ -81,7 +82,7 @@ public class TorrentsComparator implements Comparator<Torrent> {
case Ratio:
return 0 - new Double(tor1.getRatio()).compareTo(new Double(tor2.getRatio()));
default:
return 0 - tor1.getName().toLowerCase().compareTo(tor2.getName().toLowerCase());
return 0 - alphanumComparator.compare(tor1.getName(), tor2.getName());
}
}
}

Loading…
Cancel
Save