没有以正确的方式使用 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();
}
}
注意:
- 这里我们实现的是
Comparable<City2>
而不是原始的
输入 Comparable
- 覆盖
compareTo()
以根据需要比较邮政编码。
- 您无需显式创建接口
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());
}
}
}
一直在寻找这个问题的答案,但我的问题似乎比其他问题更具体。
所以我有两个 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();
}
}
注意:
- 这里我们实现的是
Comparable<City2>
而不是原始的 输入Comparable
- 覆盖
compareTo()
以根据需要比较邮政编码。 - 您无需显式创建接口
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());
}
}
}