没有正确使用可比界面

时间:2019-01-20 12:52:23

标签: java list sorting comparable

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

所以我有两个类和一个接口。该接口称为“可比较”,我知道该接口确实有其自己的方法,但是我们很快就会知道。

我所拥有的是称为“ cityMain”,“ City2”和“可比较”接口的类

我的程序当前正在执行的操作是从txt文件中读取内容,例如:

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

分号消失,整数和字符串分成两部分。 数字是邮政编码,旁边的东西仅仅是瑞典一些州的名称。从“ mainCity”中读取它之后,我实际上是对其进行排序,以便其名称的顶部拉链位于顶部,从最小到最大。

然后,当要读取它时,它将转到“ City2”类,并从那里开始使用每种方法,一次压缩和一种状态。

但是:Atm我实际上是从主设备而不是从界面调用所有东西。

它应该像这样“ mainCity”->“ Comparable”->“ City2”。 该程序按原样工作,但我希望它是正确的!

我试图从“可比较”中删除,然后这样称呼它,但是它没有用,也没有给我一个错误。 再次注意: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博登

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

3 个答案:

答案 0 :(得分:1)

如果计划使用Java标准库排序,则需要使用标准接口。您需要集合元素来实现java.lang.Comparable或单独的java.lang.Comparator对象。

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

您已经创建了java.lang.Comparator以下为(c1, c2)的lambda:

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

尽管您也可以这样写:

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

或使用List.sort

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

答案 1 :(得分:1)

如果您明确要求使用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提供的一个。

答案 2 :(得分:0)

好吧...

现在几乎完成了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());
    }

}
}