mirror of
https://github.com/nextcloud/android.git
synced 2024-11-24 22:25:44 +03:00
AlphaNumComparator: optimize usage and resolve signature problems
- Methods had ambiguous signatures (parameterized compare<T> overlapped the various typed compare()). This made the compiler very confused. - In several places throughout the app, AlphaNumComparator was getting repeatedly instantiated just to manually call a typed compare(). This was very wasteful To solve both problems, the typed compare() methods have been been made static. The performance gains of not instantiating the comparator repeatedly are very noticeable. In a test loading a local folder for upload with 1000 files in it, time of load is reduced from 28 seconds to 17 seconds. Signed-off-by: Álvaro Brey Vilas <alvaro.brey@nextcloud.com>
This commit is contained in:
parent
462da35fdb
commit
2baf63d809
4 changed files with 16 additions and 16 deletions
|
@ -419,13 +419,13 @@ public class TestSorting {
|
|||
if (sortedList.get(0) instanceof OCFile) {
|
||||
Collections.sort(unsortedList, (Comparator<OCFile>) (o1, o2) -> {
|
||||
if (o1.isFolder() && o2.isFolder()) {
|
||||
return new AlphanumComparator().compare(o1, o2);
|
||||
return AlphanumComparator.compare(o1, o2);
|
||||
} else if (o1.isFolder()) {
|
||||
return -1;
|
||||
} else if (o2.isFolder()) {
|
||||
return 1;
|
||||
}
|
||||
return new AlphanumComparator().compare(o1, o2);
|
||||
return AlphanumComparator.compare(o1, o2);
|
||||
});
|
||||
} else {
|
||||
Collections.sort(unsortedList, new AlphanumComparator<>());
|
||||
|
|
|
@ -478,13 +478,13 @@ public class OCFile implements Parcelable, Comparable<OCFile>, ServerFileInterfa
|
|||
@Override
|
||||
public int compareTo(@NonNull OCFile another) {
|
||||
if (isFolder() && another.isFolder()) {
|
||||
return new AlphanumComparator().compare(this, another);
|
||||
return AlphanumComparator.compare(this, another);
|
||||
} else if (isFolder()) {
|
||||
return -1;
|
||||
} else if (another.isFolder()) {
|
||||
return 1;
|
||||
}
|
||||
return new AlphanumComparator().compare(this, another);
|
||||
return AlphanumComparator.compare(this, another);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -51,13 +51,13 @@ public class FileSortOrderByName extends FileSortOrder {
|
|||
|
||||
Collections.sort(files, (o1, o2) -> {
|
||||
if (o1.isFolder() && o2.isFolder()) {
|
||||
return multiplier * new AlphanumComparator().compare(o1, o2);
|
||||
return multiplier * AlphanumComparator.compare(o1, o2);
|
||||
} else if (o1.isFolder()) {
|
||||
return -1;
|
||||
} else if (o2.isFolder()) {
|
||||
return 1;
|
||||
}
|
||||
return multiplier * new AlphanumComparator().compare(o1, o2);
|
||||
return multiplier * AlphanumComparator.compare(o1, o2);
|
||||
});
|
||||
|
||||
return super.sortCloudFiles(files);
|
||||
|
@ -75,13 +75,13 @@ public class FileSortOrderByName extends FileSortOrder {
|
|||
|
||||
Collections.sort(files, (o1, o2) -> {
|
||||
if (o1.isFolder() && o2.isFolder()) {
|
||||
return multiplier * new AlphanumComparator().compare(o1, o2);
|
||||
return multiplier * AlphanumComparator.compare(o1, o2);
|
||||
} else if (o1.isFolder()) {
|
||||
return -1;
|
||||
} else if (o2.isFolder()) {
|
||||
return 1;
|
||||
}
|
||||
return multiplier * new AlphanumComparator().compare(o1, o2);
|
||||
return multiplier * AlphanumComparator.compare(o1, o2);
|
||||
});
|
||||
|
||||
return super.sortTrashbinFiles(files);
|
||||
|
@ -105,7 +105,7 @@ public class FileSortOrderByName extends FileSortOrder {
|
|||
} else if (o2.isDirectory()) {
|
||||
return 1;
|
||||
}
|
||||
return multiplier * new AlphanumComparator().compare(o1.getPath()
|
||||
return multiplier * AlphanumComparator.compare(o1.getPath()
|
||||
.toLowerCase(Locale.getDefault()),
|
||||
o2.getPath().toLowerCase(Locale.getDefault()));
|
||||
});
|
||||
|
|
|
@ -49,18 +49,18 @@ import java.util.Comparator;
|
|||
* by Tobias Kaminsky
|
||||
*/
|
||||
public class AlphanumComparator<T> implements Comparator<T>, Serializable {
|
||||
private boolean isDigit(char ch) {
|
||||
private static boolean isDigit(char ch) {
|
||||
return ch >= 48 && ch <= 57;
|
||||
}
|
||||
|
||||
private boolean isSpecialChar(char ch) {
|
||||
private static boolean isSpecialChar(char ch) {
|
||||
return ch <= 47 || ch >= 58 && ch <= 64 || ch >= 91 && ch <= 96 || ch >= 123 && ch <= 126;
|
||||
}
|
||||
|
||||
/**
|
||||
* Length of string is passed in for improved efficiency (only need to calculate it once)
|
||||
**/
|
||||
private String getChunk(String string, int stringLength, int marker) {
|
||||
private static String getChunk(String string, int stringLength, int marker) {
|
||||
StringBuilder chunk = new StringBuilder();
|
||||
char c = string.charAt(marker);
|
||||
chunk.append(c);
|
||||
|
@ -87,14 +87,14 @@ public class AlphanumComparator<T> implements Comparator<T>, Serializable {
|
|||
return chunk.toString();
|
||||
}
|
||||
|
||||
public int compare(ServerFileInterface o1, ServerFileInterface o2) {
|
||||
public static int compare(ServerFileInterface o1, ServerFileInterface o2) {
|
||||
String s1 = o1.getFileName();
|
||||
String s2 = o2.getFileName();
|
||||
|
||||
return compare(s1, s2);
|
||||
}
|
||||
|
||||
public int compare(File f1, File f2) {
|
||||
public static int compare(File f1, File f2) {
|
||||
String s1 = f1.getPath();
|
||||
String s2 = f2.getPath();
|
||||
|
||||
|
@ -105,7 +105,7 @@ public class AlphanumComparator<T> implements Comparator<T>, Serializable {
|
|||
return compare(t1.toString(), t2.toString());
|
||||
}
|
||||
|
||||
public int compare(String s1, String s2) {
|
||||
public static int compare(String s1, String s2) {
|
||||
int thisMarker = 0;
|
||||
int thatMarker = 0;
|
||||
int s1Length = s1.length();
|
||||
|
|
Loading…
Reference in a new issue