没有以正确的方式使用 Comparable 接口

Not using the Comparable interface in the right way

一直在寻找这个问题的答案,但我的问题似乎比其他问题更具体。

所以我有两个 classes 和一个接口。该接口称为 "Comparable",我知道该接口确实有其自己的方法,但我们稍后会介绍它。

我拥有的是名为 "cityMain"、"City2" 的 classes 和接口 "Comparable"

我的程序现在正在做的是从一个 txt 文件中读取类似这样的内容:

75242;乌普萨拉 90325;于默奥 96133;博登 23642;霍尔维肯 35243;韦克舍 51000;延雪平 72211;韦斯特罗斯 等等

分号消失,整数和字符串一分为二。 这些数字是邮政编码,旁边的数字只是瑞典某些州的名称。从 "mainCity" 读取它后,我实际上是在对其进行排序,以便带有它的名称的顶部 zip 位于顶部,因此从最小到最大。

然后当它开始阅读它时,它会转到 "City2" class,然后从那里它通过每种方法,一次通过一个 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 霍尔维肯 35243 韦克舍 51000 延雪平 72211 韦斯特罗斯 75242乌普萨拉 90325于默奥 96133博登

现在任何事情都将不胜感激!

如果您打算使用 Java 标准库排序,您需要使用标准接口。您需要任一集合元素来实现 java.lang.Comparable or a separate java.lang.Comparator 对象。

最好删除或重命名您自己的 Comparator 版本,因为 java.lang 类 是自动导入的,因此在查看您的代码时不清楚实际使用的是哪个版本.

您已经使用以下 (c1, c2) lambda 创建了一个 java.lang.Comparator

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

尽管您也可以将其写为:

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

或使用List.sort:

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

如果您明确要求使用 Comparable 界面,则将您的 City2 class 更改为:

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 提供的那个。

好吧...

现在几乎 100% 完成了!

但我一遍又一遍地得到相同的答案...

想法? 这就像印刷品重复但最后几行实际上是正确的....

主要class: public class 主城

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:

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

}
}