Skip to content

Commit f992185

Browse files
author
Niall Pemberton
committed
IO-142 Add facility to sort file lists/arrays to Comparator implementations
git-svn-id: https://svn.apache.org/repos/asf/commons/proper/io/trunk@721626 13f79535-47bb-0310-9956-ffa450edef68
1 parent d55dd62 commit f992185

15 files changed

Lines changed: 149 additions & 41 deletions
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one or more
3+
* contributor license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright ownership.
5+
* The ASF licenses this file to You under the Apache License, Version 2.0
6+
* (the "License"); you may not use this file except in compliance with
7+
* the License. You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
package org.apache.commons.io.comparator;
18+
19+
import java.io.File;
20+
import java.util.Arrays;
21+
import java.util.Collections;
22+
import java.util.Comparator;
23+
import java.util.List;
24+
25+
/**
26+
* Abstract file {@link Comparator} which provides sorting for file arrays and lists.
27+
*
28+
* @version $Revision$ $Date$
29+
* @since Commons IO 2.0
30+
*/
31+
abstract class AbstractFileComparator implements Comparator<File> {
32+
33+
/**
34+
* Sort an array of files.
35+
* <p>
36+
* This method uses {@link Arrays#sort(File[], Comparator)}
37+
* and returns the original array.
38+
*
39+
* @param files The files to sort, may be null
40+
* @return The sorted array
41+
*/
42+
public File[] sort(File... files) {
43+
if (files != null) {
44+
Arrays.sort(files, this);
45+
}
46+
return files;
47+
}
48+
49+
/**
50+
* Sort a List of files.
51+
* <p>
52+
* This method uses {@link Collections#sort(List, Comparator)}
53+
* and returns the original list.
54+
*
55+
* @param files The files to sort, may be null
56+
* @return The sorted list
57+
*/
58+
public List<File> sort(List<File> files) {
59+
if (files != null) {
60+
Collections.sort(files, this);
61+
}
62+
return files;
63+
}
64+
}

src/java/org/apache/commons/io/comparator/DefaultFileComparator.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,21 +30,21 @@
3030
* {@link #DEFAULT_COMPARATOR} singleton instance:
3131
* <pre>
3232
* List&lt;File&gt; list = ...
33-
* Collections.sort(list, DefaultFileComparator.DEFAULT_COMPARATOR);
33+
* DefaultFileComparator.DEFAULT_COMPARATOR.sort(list);
3434
* </pre>
3535
* <p>
3636
* Example of doing a <i>reverse</i> sort of an array of files using the
3737
* {@link #DEFAULT_REVERSE} singleton instance:
3838
* <pre>
3939
* File[] array = ...
40-
* Arrays.sort(array, DefaultFileComparator.DEFAULT_REVERSE);
40+
* DefaultFileComparator.DEFAULT_REVERSE.sort(array);
4141
* </pre>
4242
* <p>
4343
*
4444
* @version $Revision$ $Date$
4545
* @since Commons IO 1.4
4646
*/
47-
public class DefaultFileComparator implements Comparator<File>, Serializable {
47+
public class DefaultFileComparator extends AbstractFileComparator implements Serializable {
4848

4949
/** Singleton default comparator instance */
5050
public static final Comparator<File> DEFAULT_COMPARATOR = new DefaultFileComparator();

src/java/org/apache/commons/io/comparator/ExtensionFileComparator.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,21 +37,21 @@
3737
* {@link #EXTENSION_COMPARATOR} singleton instance:
3838
* <pre>
3939
* List&lt;File&gt; list = ...
40-
* Collections.sort(list, ExtensionFileComparator.EXTENSION_COMPARATOR);
40+
* ExtensionFileComparator.EXTENSION_COMPARATOR.sort(list);
4141
* </pre>
4242
* <p>
4343
* Example of a <i>reverse case-insensitive</i> file extension sort using the
4444
* {@link #EXTENSION_INSENSITIVE_REVERSE} singleton instance:
4545
* <pre>
4646
* File[] array = ...
47-
* Arrays.sort(array, ExtensionFileComparator.EXTENSION_INSENSITIVE_REVERSE);
47+
* ExtensionFileComparator.EXTENSION_INSENSITIVE_REVERSE.sort(array);
4848
* </pre>
4949
* <p>
5050
*
5151
* @version $Revision$ $Date$
5252
* @since Commons IO 1.4
5353
*/
54-
public class ExtensionFileComparator implements Comparator<File>, Serializable {
54+
public class ExtensionFileComparator extends AbstractFileComparator implements Serializable {
5555

5656
/** Case-sensitive extension comparator instance (see {@link IOCase#SENSITIVE}) */
5757
public static final Comparator<File> EXTENSION_COMPARATOR = new ExtensionFileComparator();

src/java/org/apache/commons/io/comparator/LastModifiedFileComparator.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,21 +31,21 @@
3131
* {@link #LASTMODIFIED_COMPARATOR} singleton instance:
3232
* <pre>
3333
* List&lt;File&gt; list = ...
34-
* Collections.sort(list, LastModifiedFileComparator.LASTMODIFIED_COMPARATOR);
34+
* LastModifiedFileComparator.LASTMODIFIED_COMPARATOR.sort(list);
3535
* </pre>
3636
* <p>
3737
* Example of doing a <i>reverse</i> sort of an array of files using the
3838
* {@link #LASTMODIFIED_REVERSE} singleton instance:
3939
* <pre>
4040
* File[] array = ...
41-
* Arrays.sort(array, LastModifiedFileComparator.LASTMODIFIED_REVERSE);
41+
* LastModifiedFileComparator.LASTMODIFIED_REVERSE.sort(array);
4242
* </pre>
4343
* <p>
4444
*
4545
* @version $Revision$ $Date$
4646
* @since Commons IO 1.4
4747
*/
48-
public class LastModifiedFileComparator implements Comparator<File>, Serializable {
48+
public class LastModifiedFileComparator extends AbstractFileComparator implements Serializable {
4949

5050
/** Last modified comparator instance */
5151
public static final Comparator<File> LASTMODIFIED_COMPARATOR = new LastModifiedFileComparator();

src/java/org/apache/commons/io/comparator/NameFileComparator.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,21 +35,21 @@
3535
* {@link #NAME_COMPARATOR} singleton instance:
3636
* <pre>
3737
* List&lt;File&gt; list = ...
38-
* Collections.sort(list, NameFileComparator.NAME_COMPARATOR);
38+
* NameFileComparator.NAME_COMPARATOR.sort(list);
3939
* </pre>
4040
* <p>
4141
* Example of a <i>reverse case-insensitive</i> file name sort using the
4242
* {@link #NAME_INSENSITIVE_REVERSE} singleton instance:
4343
* <pre>
4444
* File[] array = ...
45-
* Arrays.sort(array, NameFileComparator.NAME_INSENSITIVE_REVERSE);
45+
* NameFileComparator.NAME_INSENSITIVE_REVERSE.sort(array);
4646
* </pre>
4747
* <p>
4848
*
4949
* @version $Revision$ $Date$
5050
* @since Commons IO 1.4
5151
*/
52-
public class NameFileComparator implements Comparator<File>, Serializable {
52+
public class NameFileComparator extends AbstractFileComparator implements Serializable {
5353

5454
/** Case-sensitive name comparator instance (see {@link IOCase#SENSITIVE}) */
5555
public static final Comparator<File> NAME_COMPARATOR = new NameFileComparator();

src/java/org/apache/commons/io/comparator/PathFileComparator.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,21 +35,21 @@
3535
* {@link #PATH_COMPARATOR} singleton instance:
3636
* <pre>
3737
* List&lt;File&gt; list = ...
38-
* Collections.sort(list, PathFileComparator.PATH_COMPARATOR);
38+
* PathFileComparator.PATH_COMPARATOR.sort(list);
3939
* </pre>
4040
* <p>
4141
* Example of a <i>reverse case-insensitive</i> file path sort using the
4242
* {@link #PATH_INSENSITIVE_REVERSE} singleton instance:
4343
* <pre>
4444
* File[] array = ...
45-
* Arrays.sort(array, PathFileComparator.PATH_INSENSITIVE_REVERSE);
45+
* PathFileComparator.PATH_INSENSITIVE_REVERSE.sort(array);
4646
* </pre>
4747
* <p>
4848
*
4949
* @version $Revision$ $Date$
5050
* @since Commons IO 1.4
5151
*/
52-
public class PathFileComparator implements Comparator<File>, Serializable {
52+
public class PathFileComparator extends AbstractFileComparator implements Serializable {
5353

5454
/** Case-sensitive path comparator instance (see {@link IOCase#SENSITIVE}) */
5555
public static final Comparator<File> PATH_COMPARATOR = new PathFileComparator();

src/java/org/apache/commons/io/comparator/ReverseComparator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
* @version $Revision$ $Date$
2828
* @since Commons IO 1.4
2929
*/
30-
class ReverseComparator implements Comparator<File>, Serializable {
30+
class ReverseComparator extends AbstractFileComparator implements Serializable {
3131

3232
private final Comparator<File> delegate;
3333

src/java/org/apache/commons/io/comparator/SizeFileComparator.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,14 @@
3333
* {@link #SIZE_COMPARATOR} singleton instance:
3434
* <pre>
3535
* List&lt;File&gt; list = ...
36-
* Collections.sort(list, LengthFileComparator.LENGTH_COMPARATOR);
36+
* SizeFileComparator.SIZE_COMPARATOR.sort(list);
3737
* </pre>
3838
* <p>
3939
* Example of doing a <i>reverse</i> sort of an array of files using the
4040
* {@link #SIZE_REVERSE} singleton instance:
4141
* <pre>
4242
* File[] array = ...
43-
* Arrays.sort(array, LengthFileComparator.LENGTH_REVERSE);
43+
* SizeFileComparator.SIZE_REVERSE.sort(array);
4444
* </pre>
4545
* <p>
4646
* <strong>N.B.</strong> Directories are treated as <b>zero size</b> unless
@@ -49,7 +49,7 @@
4949
* @version $Revision$ $Date$
5050
* @since Commons IO 1.4
5151
*/
52-
public class SizeFileComparator implements Comparator<File>, Serializable {
52+
public class SizeFileComparator extends AbstractFileComparator implements Serializable {
5353

5454
/** Size comparator instance - directories are treated as zero size */
5555
public static final Comparator<File> SIZE_COMPARATOR = new SizeFileComparator();

src/test/org/apache/commons/io/comparator/ComparatorAbstractTestCase.java

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@
1717
package org.apache.commons.io.comparator;
1818

1919
import java.io.File;
20+
import java.util.ArrayList;
2021
import java.util.Comparator;
22+
import java.util.List;
23+
2124
import org.apache.commons.io.testtools.FileBasedTestCase;
2225

2326
/**
@@ -26,7 +29,7 @@
2629
public abstract class ComparatorAbstractTestCase extends FileBasedTestCase {
2730

2831
/** comparator instance */
29-
protected Comparator comparator;
32+
protected AbstractFileComparator comparator;
3033

3134
/** reverse comparator instance */
3235
protected Comparator reverse;
@@ -53,7 +56,7 @@ public ComparatorAbstractTestCase(String name) {
5356

5457
/** @see junit.framework.TestCase#setUp() */
5558
protected void setUp() throws Exception {
56-
comparator = DefaultFileComparator.DEFAULT_COMPARATOR;
59+
comparator = (AbstractFileComparator)DefaultFileComparator.DEFAULT_COMPARATOR;
5760
reverse = DefaultFileComparator.DEFAULT_REVERSE;
5861
}
5962

@@ -84,4 +87,32 @@ public void testReverseComparator() {
8487
assertTrue("less", reverse.compare(moreFile, lessFile) < 0);
8588
assertTrue("more", reverse.compare(lessFile, moreFile) > 0);
8689
}
90+
91+
/**
92+
* Test the comparator array sort.
93+
*/
94+
public void testSortArray() {
95+
File[] files = new File[3];
96+
files[0] = equalFile1;
97+
files[1] = moreFile;
98+
files[2] = lessFile;
99+
comparator.sort(files);
100+
assertTrue("equal", files[0] == lessFile);
101+
assertTrue("less", files[1] == equalFile1);
102+
assertTrue("more", files[2] == moreFile);
103+
}
104+
105+
/**
106+
* Test the comparator array sort.
107+
*/
108+
public void testSortList() {
109+
List<File> files = new ArrayList<File>();
110+
files.add(equalFile1);
111+
files.add(moreFile);
112+
files.add(lessFile);
113+
comparator.sort(files);
114+
assertTrue("equal", files.get(0) == lessFile);
115+
assertTrue("less", files.get(1) == equalFile1);
116+
assertTrue("more", files.get(2) == moreFile);
117+
}
87118
}

src/test/org/apache/commons/io/comparator/DefaultFileComparatorTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,11 @@ public DefaultFileComparatorTest(String name) {
5656
/** @see junit.framework.TestCase#setUp() */
5757
protected void setUp() throws Exception {
5858
super.setUp();
59-
comparator = DefaultFileComparator.DEFAULT_COMPARATOR;
59+
comparator = (AbstractFileComparator)DefaultFileComparator.DEFAULT_COMPARATOR;
6060
reverse = DefaultFileComparator.DEFAULT_REVERSE;
61-
equalFile1 = new File("same");
62-
equalFile2 = new File("same");
61+
equalFile1 = new File("foo");
62+
equalFile2 = new File("foo");
6363
lessFile = new File("ABC");
64-
moreFile = new File("DEF");
64+
moreFile = new File("XYZ");
6565
}
6666
}

0 commit comments

Comments
 (0)