2015-04-03 1 views
0

L'affectation demande à l'utilisateur de trier les noms de chemin par nombre de barres obliques et par ordre lexicographique. Les instructions spécifiques sont « Votre tâche est de trier une liste de tableau de noms de chemin tels queL'interface du comparateur ne compile pas et a du mal à trier le tableau deux fois

\home\me\cs1 
\usr\share 
\var\log 
\usr\local\jdk1.6.0\jre\lib 

FileName est de lire les noms de chemin, puis trier la longueur du chemin, à savoir le nombre de barres obliques dans le chemin. les noms de chemins de même longueur doivent être disposés dans l'ordre lexicographique (ie en appelant String.compareTo.) par exemple, les noms de chemin indiqués ci-dessus seront classés comme "

\usr\share 
\var\log 
\home\me\cs1 
\usr\local\jdk1.6.0\jre\lib 

Heres le code que j'ai jusqu'à présent. J'ai des problèmes car je continue à recevoir une erreur qui dit qu'il ne trouve pas le cymbol "Collections à la ligne 38" et "l'interface attendue à la ligne 13". Je ne suis pas sûr non plus de savoir comment trier l'aracyliste lexicographique sans avoir à chambouler l'ordre après avoir trié les barres obliques.

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

ce qui est cette 'interface publique Comparator { int compare (String a, String b); } ' –

+0

Il y a pas mal d'erreurs ici. Vous devriez revenir en arrière et examiner votre matériel de cours (en particulier les génériques et 'Comparable' /' Comparator') parce qu'il est clair que vous n'avez pas une compréhension complète de ces concepts. – Radiodef

+0

@javaProgrammer, la discussion et la réponse fournies vous ont-elles aidé à résoudre votre problème? – Yantraguru

Répondre

0

Vous devez importer Collections comme ceci:

import java.util.Collections; 

En ce qui concerne le tri, vous pouvez le faire dans le même comparateur. Où vous avez maintenant:

if (countSlashes(p1) == countSlashes(p2)) 
    return 0; 

au lieu de retourner 0 vous comparer les deux chaînes lexicographique et le retourner.

if (countSlashes(p1) == countSlashes(p2)) 
    return p1.compareTo(p2); 

@EDIT:

Aussi je pense que vous voulez utiliser Comparable au lieu de votre propre Comparator.

@ Edit2:

De plus, cette p.replace("/", "") crée un nouveau String chaque fois que vous appelez qui n'est pas la façon la plus efficace. Vous pourriez simplement faire une boucle sur la chaîne et compter le nombre de /.

+0

un demi-point pour répondre à la moitié de la question. –

0

1) Lorsque j'ai essayé votre code, il ne prenait pas les entrées correctement, donc je l'ai modifié pour m'assurer que toutes les entrées sont reçues. J'utilise ## comme séquence d'échappement pour terminer l'opération de lecture.

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

J'utilise ## comme séquence d'échappement.

2) L'étape suivante consiste à avoir une chaîne de comparateur. Veuillez vous référer à l'exemple Sorting by multiple attributes

Le problème que vous essayez de résoudre est similaire. Le premier comparateur comparera le nombre de caractères slash et le second comparera par ordre alphabétique.

Pour le deuxième comparateur, vous pouvez ignorer les barres obliques et comparer. Cela simplifiera grandement le code.

Si vous voulez le faire avec un seul comparateur, voici le code comparateur

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

} 
} 

Ce qui peut être appelé simplement comme

Collections.sort(arr, new FileNameComparator()); 
    System.out.println("Sorted file names:" + arr); 
    System.out.println(arr);