该分配要求用户按字节顺序和字典顺序对路径名进行排序。具体说明是“您的任务是对路径名称的数组列表进行排序,例如
\home\me\cs1
\usr\share
\var\log
\usr\local\jdk1.6.0\jre\lib
FileName是读入路径名,然后对路径长度进行排序,即路径名中的斜杠数。相同长度的路径名应按字典顺序排列(即通过调用String.compareTo。)例如,上面给出的路径名将被排序为“
\usr\share
\var\log
\home\me\cs1
\usr\local\jdk1.6.0\jre\lib
这是我到目前为止的代码。我遇到了麻烦,我一直收到一个错误,说它无法找到符号“第38行的集合”和“第13行预期的接口”。我也不确定如何在我用斜线排序之后对arraylist lexicographic进行排序而不会搞乱订单。
import java.util.Arrays;
import java.util.ArrayList;
public class FileName implements Comparator<String>
{
public FileName()
{
}
private static int countSlashes(String p)
{
return p.length() - p.replace("/", "").length();
}
public int compareTo(String p1, String p2)
{
if (countSlashes(p1) < countSlashes(p2))
return -1;
if (countSlashes(p1) == countSlashes(p2))
return 0;
return 1;
}
public ArrayList sortArrays(ArrayList input)
{
return Collections.sort(input);
}
public interface Comparator<String>
{
int compare(String a, String b);
}
}
.....
Tester Class
/**
* @(#)FileNamePrgm.java
*
*
* @author
* @version 1.00 2015/4/2
*/
import java.util.Arrays;
import java.util.ArrayList;
import java.util.Scanner;
public class FileNamePrgm
{
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
System.out.println("How many file names will you be entering?");
int x=in.nextInt();
ArrayList<String> arr=new ArrayList<String>();
System.out.println("Input file names");
String file;
for (int i=0; i<x; i++)
{
String fileN=in.nextLine();
arr.add(fileN);
}
ArrayList sorted=FileName.sortArrays(arr);
System.out.println("Sorted file names:");
System.out.println(sorted);
}
}
答案 0 :(得分:0)
您需要像这样导入Collections
:
import java.util.Collections;
至于排序,你可以在同一个比较器中完成所有操作。你现在所在的地方:
if (countSlashes(p1) == countSlashes(p2))
return 0;
不是返回0
,而是按字典顺序比较两个字符串并返回。
if (countSlashes(p1) == countSlashes(p2))
return p1.compareTo(p2);
@Edit:
此外,我认为您要使用Comparable而不是您自己的Comparator
。
@ EDIT2:
此p.replace("/", "")
每次调用时都会创建一个新的String
,这不是最有效的方法。您可以循环遍历字符串并计算/
的数量。
答案 1 :(得分:0)
1)当我尝试你的代码时,它没有正确输入,所以我修改它以确保收到所有输入。
Scanner in = new Scanner(System.in);
// System.out.println("How many file names will you be entering?");
ArrayList<String> arr = new ArrayList<String>();
System.out
.println("Input file names and press (## to finish entering)");
while (in.hasNextLine()) {
String fileName = in.nextLine();
if (fileName.equals("##")) {
break;
}
arr.add(fileName);
}
in.close();
我使用##作为转义序列来完成读操作。
2)下一步是拥有比较器链。请参阅示例Sorting by multiple attributes
您尝试解决的问题与此类似。第一个比较器将比较斜杠字符的数量,第二个比较器将按字母顺序进行比较。
对于第二个比较器,您可以忽略斜杠并进行比较。这将大大简化代码。
如果您只想使用一个比较器,这里是比较器代码
class FileNameComparator implements Comparator<String> {
@Override
public int compare(String o1, String o2) {
// Compare slashes first
int o1count = o1.length() - o1.replace("\\", "").length();
int o2count = o2.length() - o2.replace("\\", "").length();
if (o1count == o2count) {
return o1.replace("\\", "").compareTo(o2.replace("\\", ""));
} else {
return o1count - o2count;
}
}
}
可以简单地称之为
Collections.sort(arr, new FileNameComparator());
System.out.println("Sorted file names:" + arr);
System.out.println(arr);