Неправильное использование интерфейса Comparable - PullRequest
0 голосов
/ 20 января 2019

Я искал ответ на этот вопрос, но, похоже, моя проблема более конкретна, чем другие.

Итак, у меня есть два класса и один интерфейс. Интерфейс называется «Comparable», и я знаю, что у интерфейса есть собственный метод, но мы вернемся к этому через секунду.

То, что у меня есть, это классы под названием "cityMain", "City2" и интерфейс "Comparable"

Что моя программа сейчас делает, так это то, что она читает из текстового файла что-то вроде:

75242; Упсала 90325; Умео 96133; Боден 23642; Höllviken 35243; Векшё 51000; Йончёпинг 72211; Вестерос и т.д.

Точка с запятой удаляется, а целые числа и строки разделяются на две части. Цифры - это почтовые индексы, а рядом с ними просто название некоторых штатов в Швеции. Прочитав его из «mainCity», я на самом деле сортирую его так, чтобы верхний почтовый индекс с его именем оказался сверху, то есть от наименьшего числа к наибольшему.

Затем, когда ему удается прочитать его, он переходит к классу "City2", а оттуда он просто проходит каждый метод, один zip и одно состояние за один раз.

ОДНАКО: Atm я на самом деле звоню все с моего основного, а не с моего интерфейса.

Он должен выглядеть так: "mainCity" -> "Comparable" -> "City2". Программа работает как есть, но я хочу, чтобы она была правильной!

Я пытался перейти от «Comparable», а затем назвать его так, но он не сработал и не дал мне ошибки. Обратите внимание: опять же, у Comparable есть свой собственный метод, но я не использовал его из-за того, что я не знаю, как его применить, как он выглядит сейчас.

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

}

Что я должен получить, что я уже получаю, но не так, как я должен это делать!

23642 Höllviken 35243 Växjö 51000 Йёнчёпинг 72211 Вестерос 75242 Упсала 90325 Умео 96133 Боден

Все было бы очень важно прямо сейчас!

Ответы [ 3 ]

0 голосов
/ 20 января 2019

Если вам явно требуется использовать интерфейс Comparable, измените класс City2 на:

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

}

Обратите внимание:

  1. Здесь мы реализуем Comparable<City2> вместо необработанного типа Comparable
  2. Переопределение compareTo() для сравнения почтовых индексов при необходимости.
  3. Нет необходимости явно создавать интерфейс Comparable,но вместо этого просто реализуйте то, что обеспечивает Java.
0 голосов
/ 20 января 2019

Хорошо, так ...

Теперь это почти на 100%!

Но я получаю один и тот же ответ снова и снова ...

Идеи? Это похоже на повтор отпечатков, но последние строки на самом деле верны ...

Основной класс: общественный класс cityMain

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

}

Второй класс:

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

}
}
0 голосов
/ 20 января 2019

Если вы планируете использовать сортировку стандартной библиотеки Java, вам нужно использовать стандартные интерфейсы.Для реализации java.lang.Comparable необходимы либо элементы коллекции, либо отдельный объект java.lang.Comparator.

Лучше всего удалить или переименовать вашу собственную версию Comparator, поэтому неясно, какая из них фактически используется при просмотре вашего кода, потому что java.lang классы импортируются автоматически.

Вы уже создали java.lang.Comparator с ниже (c1, c2) лямбда:

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

, хотя вы могли бы написать его также как:

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

Или используя List.sort:

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