1
votes

Ne pas utiliser l'interface comparable de la bonne manière

Je cherchais une réponse à cela, mais il semble que mon problème soit plus spécifique que d'autres.

J'ai donc deux classes et une interface. L'interface s'appelle "Comparable" et je sais que l'interface a sa propre méthode, mais nous y reviendrons dans une seconde.

Ce que j'ai, ce sont les classes appelées "cityMain", "City2" et l'interface "Comparable"

Ce que mon programme fait actuellement, c'est qu'il lit un fichier txt avec quelque chose comme:

75242; Uppsala 90325; Umeà ¥ 96133; Boden 23642; Höllviken 35243; Växjö 51000; Jönköping 72211; Västerà ¥ s etc

Le point-virgule s'échappe et les entiers et les chaînes se divisent en deux. Les numéros sont des codes postaux et la chose à côté n'est que le nom de certains États en Suède. Après l'avoir lu dans "mainCity", je le trie pour que le zip supérieur avec son nom soit en haut, donc du plus petit nombre au plus grand.

Puis quand il sera lu il, il va à la classe "City2" et à partir de là, il passe par toutes les méthodes, un zip et un état à la fois.

CEPENDANT: Atm, j'appelle en fait tout à partir de mon principal et NON de mon interface.

Cela devrait ressembler à ceci "mainCity" -> "Comparable" -> "City2 ". Le programme fonctionne tel quel mais je veux qu'il soit correct!

J'ai essayé de passer du "Comparable" puis de l'appeler comme ça mais ça n'a pas fonctionné et ça ne m'a pas donné d'erreur . Remarquez, encore une fois: ce comparable a sa propre méthode mais je ne l'ai pas utilisé car je ne saurais pas comment l'appliquer tel qu'il apparaît actuellement.

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;


public class cityMain {

private static BufferedReader r;

public static void main(String[] args) {
    int Z = 0;
    String C = null;
    try {
        ArrayList<City2> City = new ArrayList<City2>();

        FileReader file = new FileReader("C:\\Users\\me\\Desktop\\BB.dat");
        r = new BufferedReader(file);
        String currLine;
        while ((currLine = r.readLine()) != null) {

            if (currLine.trim().length() > 0) {
                String[] split = currLine.split(";");
                Z = (Integer.parseInt(split[0]));
                C = (split[1]);
                City.add(new City2(Z, C));
            }
        }
        Collections.sort(City, (c1, c2) -> c1.getZipCode() - c2.getZipCode());

        for (int i = 0; i < City.size(); i++) {
            System.out.println(City.get(i).getZipCode() + " " + City.get(i).getCityName());

        }

    } catch (IOException e) {
        System.out.println("Erorr : " + e);
    }

}

}


HERE IS A DIFFERENT CLASS:

public class City2 implements Comparable {

private int zipCode;
private String cityName;

public City2(int zipCode, String cityName) {
    this.zipCode = zipCode;
    this.cityName = cityName;
}

public int getZipCode() {
    return zipCode;
}

public String getCityName() {
    return cityName;
}

public void addAndPrint() {

}

}

HERE IS THE INTERFACE:

public interface Comparable {

public int getZipCode();

public String getCityName();

public void addAndPrint(); 

}

Ce que je devrais obtenir, ce que je fais déjà mais pas de la manière dont je suis censé le faire!

23642 Höllviken 35243 Växjö 51000 Jönköping 72211 Västerà ¥ s 75242 Uppsala 90325 Umeà ¥ 96133 Boden

Tout serait très apprécié dès maintenant!


5 commentaires

pourquoi avez-vous créé votre propre interface Comparable?


Parce que je n'ai pas l'habitude d'utiliser des interfaces et que je pensais que c'était la façon de le faire ....: /


supprimez l'interface que vous avez créée et utilisez celle que Java fournit déjà. si vous implémentez correctement cette interface, elle fonctionnera comme vous le souhaitez


Je me sens comme le roi noob de Java en ce moment.


Ouais, mais c'était une question de lecture et de tri. Maintenant, j'ai juste besoin de savoir comment mettre en œuvre le comparable et l'utiliser.


3 Réponses :


1
votes

Si vous prévoyez d'utiliser le tri de bibliothèque standard Java, vous devez utiliser des interfaces standard. Vous avez besoin de l'un ou l'autre des éléments de collection pour implémenter java. lang.Comparable ou un Objet java.lang.Comparator .

Il serait préférable de supprimer ou de renommer votre propre version de Comparator , cela ne permet pas de savoir laquelle est réellement utilisée lorsque vous regardez votre code car les classes java.lang sont importé automatiquement.

Vous avez déjà créé un java.lang.Comparator avec ci-dessous (c1, c2) lambda:

City.sort(Comparator.comparingInt(City2::getZipCode));

bien que vous ayez pu l'écrire aussi comme:

Collections.sort(City, Comparator.comparingInt(City2::getZipCode));

Ou en utilisant List.sort :

Collections.sort(City, (c1, c2) -> c1.getZipCode() - c2.getZipCode());


2 commentaires

Eh bien, je vois mais comment ajouter cela dans la classe City qui a Comparable comme méthode? J'ai supprimé l'interface, puis la méthode de Comparable est apparue. Mon devoir dit que je dois encore l'utiliser ...: /


@AxwellSmith implémente la méthode selon les règles d'interface Comparable , en comparant l'argument de méthode à this . Cela peut être aussi simple que renvoyer this.zipCode - other.zipCode; . Ensuite, c'est juste Collections.sort (City);



1
votes

Si vous souhaitez explicitement utiliser l'interface Comparable , remplacez votre classe City2 par:

public class City2 implements Comparable<City2> {

    private int zipCode;
    private String cityName;

    public City2(int zipCode, String cityName) {
        this.zipCode = zipCode;
        this.cityName = cityName;
    }

    public int getZipCode() {
        return zipCode;
    }

    public String getCityName() {
        return cityName;
    }

    public void addAndPrint() {

    }

    @Override
    public int compareTo(City2 city) {
        return this.getZipCode() - city.getZipCode();
    }

}

Observez que: p >

  1. Ici, nous implémentons le Comparable plutôt que le brut tapez Comparable
  2. Remplacement de compareTo () pour comparer les codes postaux si nécessaire.
  3. Vous n'avez pas besoin de créer explicitement une interface Comparable , mais implémentez simplement celui fourni par Java.


0 commentaires

0
votes

D'accord, alors ...

Maintenant, c'est presque terminé à 100%!

Mais j'obtiens encore et encore la même réponse ...

Des idées? C'est comme si les impressions se répètent mais les dernières lignes sont en fait correctes ....

Classe principale: public class cityMain

class City2 implements Comparable<City2> {

private int zipCode;
private String cityName;

public City2(int zipCode, String cityName) {
    this.zipCode = zipCode;
    this.cityName = cityName;
}

public int getZipCode() {
    return zipCode;
}

public String getCityName() {
    return cityName;
}

@Override
public int compareTo(City2 city) {
    return this.getZipCode() - city.getZipCode();
}

public void print() {

    for (int i = 0; i < cityMain.City.size(); i++) {
        System.out.println(cityMain.City.get(i).getZipCode() + " " + cityMain.City.get(i).getCityName());
    }

}
}

Deuxième classe:

private static BufferedReader r;
public static ArrayList<City2> City = new ArrayList<City2>();
public static void main(String[] args) {
    int Z = 0;
    String C = null;
    try {
        FileReader file = new FileReader("C:\\Users\\karwa\\Desktop\\BB.dat");
        r = new BufferedReader(file);
        String currLine;
        while ((currLine = r.readLine()) != null) {
            City.sort(Comparator.comparing(City2::getZipCode));
            if (currLine.trim().length() > 0) {
                String[] split = currLine.split(";");
                Z = (Integer.parseInt(split[0]));
                C = (split[1]);
                City2 d = new City2(Z, C);
                City.add(d);
                d.print();
            }
        }

    } catch (IOException e) {
        System.out.println("Erorr : " + e);
    }

}


8 commentaires

Euh, une raison pour laquelle vous publiez également une réponse? Ce n'est pas un problème, mais cela inclut une autre question :)


Np. Mais si vous voyez pourquoi mon code s'imprime comme 20 lignes mais ne me donne que les lignes correctes à la fin, veuillez me le faire savoir xd.


C'est simple. Effectuez le tri après que vous avez ajouté tous les éléments à la liste pas pendant la lecture du fichier. Triez la liste en dehors de la boucle while .


Pourquoi utilisez-vous print () ? Où imprimez-vous également la liste?


Parce que je veux imprimer les résultats? Ma mission veut aussi que je le fasse. Dans la classe City, j'imprime tout. Dois-je simplement l'imprimer en main?


Je pense que vous devez imprimer la liste et non pas tous les objets que vous mettez dans la liste. Pas besoin d'inclure le print () dans la classe City2 , à la place il suffit d'imprimer la liste. list.forEach (System.out :: println);


Eh bien, je vois ... mais dès que j'imprime dans la méthode principale en dehors de la boucle while, tout semble bien ... o_0 c'est étrange pour moi xD


C'est assez simple en fait. Juste que vous avez mélangé deux choses! :) De plus, il n'est pas nécessaire d'inclure une réponse si elle contient une autre question.