2015-04-03 42 views
0

該分配要求用戶按斜槓數和字典順序對路徑名進行排序。具體的指令是「你的任務是如比較器接口沒有編譯且無法排序數組兩次

\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 

赫雷什我到目前爲止的代碼。我遇到了麻煩,因爲我不斷收到一個錯誤,指出它找不到cymbol「第38行的集合」和「第13行的預期接口」。我也不確定如何排序列表中的詞典編纂,而不會在按斜槓排序後搞亂順序。

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

這是什麼'公共接口比較 { INT compare(String a,String b); }' – 2015-04-03 04:19:10

+0

這裏有很多錯誤。你應該回頭查看你的課程資料(尤其是泛型和'Comparable' /'Comparator'),因爲很明顯你沒有完全理解這些概念。 – Radiodef 2015-04-03 05:02:46

+0

@javaProgrammer,討論和答案提供了幫助你解決你的問題? – Yantraguru 2015-04-03 10:18:54

回答

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每次。你可以循環字符串並計算/的數量。

+0

半數回答問題的一半。 – 2015-04-03 04:18:45

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)下一步是有比較器鏈。請參考示例​​

您試圖解決的問題與此類似。第一個比較器將比較斜線字符的數量,第二個比較器將按字母順序進行比較。

對於第二個比較器,可以忽略斜槓和比較。這將大大簡化代碼。

如果你只想要一個比較做到這一點,這裏是比較碼

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