比较器接口无法编译并且无法对数组进行两次排序

时间:2015-04-03 04:12:38

标签: java sorting arraylist compareto alphabetical

该分配要求用户按字节顺序和字典顺序对路径名进行排序。具体说明是“您的任务是对路径名称的数组列表进行排序,例如

\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);





    }


}

2 个答案:

答案 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);