我使用Comparable和getter / setter创建了一个对象Student,以及一个覆盖compareTo的方法。在单独的文件中,从文本文件中填充对象的arraylist。现在我需要将arraylist中的值与另一个Student对象进行比较。
该文件用于创建一个arraylist,如下所示:
try {
private static ArrayList<Student> array = new ArrayList<Student>();
File file = new File("students.txt");
Scanner scanner = new Scanner(file);
while (scanner.hasNextLine()) {
String inline = scanner.nextLine();
String[] split = inline.split(":");
Student myStudent = new Student();
myStudent.setUsername(split[0]);
myStudent.setPassword(split[1]);
array.add(myStudent);
}
scanner.close();
}
catch (FileNotFoundException e)
{
System.out.println("ERROR.");
}
文本文件如下所示:
约翰:密码1
简:密码2
杰克:password3
(每行一个,中间没有空行。)
在一个单独的方法中,将创建的Student对象与arraylist中的元素进行比较:
Student aStudent = new Student();
aStudent.setUsername("student");
aStudent.setPassword("password");
boolean found = false;
for (int i = 0; i < array.size(); i++)
{
if (array.get(i).compareTo(aStudent) == 0)
{
System.out.println(aStudent.equals(array.get(i)));
found = true;
break;
}
else
{
System.out.println("No such records found!");
found = false;
break;
}
System.out.println(found);
}
问题是对象aStudent没有与arraylist中的对象进行比较。对于compareTo的调用,它不打印任何内容(-1,0或1),但它总是显示found为true,即使在文件中没有aStudent匹配时它应该为false(在那里与用户名&#34;学生&#34;或密码&#34;密码&#34;)没有任何匹配。
我的所有代码都符合并且有效 - 它只是工作不正确。
对不起,如果这听起来很混乱。简而言之,我的问题是如何使用Comparable接口和compareTo将arraylist的对象与另一个对象进行比较?如果你能告诉我我做错了什么,那就加分了。
提前谢谢。
修改
以下是compareTo方法的重写:
public int compareTo(Student obj){
int result = 1;
if ((this.Username.compareToIgnoreCase(object.Username) < 0) || (this.Password.compareTo(object.Password) < 0))
{
result = -1;
}
else if ((this.Username.compareToIgnoreCase(object.Username) == 0) && (this.Password.compareTo(object.Password) == 0))
{
result = 0;
}
return result;
}
答案 0 :(得分:1)
更多上下文会有用,但您的for-loop
看起来不对...
for (int i = 0; i < array.size(); i++)
{
if (array.get(i).compareTo(aStudent) == 0)
{
System.out.println(aStudent.equals(array.get(i)));
found = true;
break; // out of loop
}
else
{
System.out.println("No such records found!");
found = false;
break; // break out loop
}
System.out.println(found);
}
break
语句用于突破循环,这意味着您只会比较列表中的第一个元素。
不需要整个else
分支(或者至少我认为不是;)),例如......
for (int i = 0; i < array.size(); i++)
{
if (array.get(i).compareTo(aStudent) == 0)
{
System.out.println(aStudent.equals(array.get(i)));
found = true;
break; // out of loop
}
}
System.out.println(found);
<强>更新强>
根据您的新compareTo
代码段,此...
if ((this.Username.compareToIgnoreCase(object.Username) < 0) || (this.Password.compareTo(object.Password) < 0))
{
result = -1;
}
else if ((this.Username.compareToIgnoreCase(object.Username) < 0) && (this.Password.compareTo(object.Password) < 0))
{
result = 0;
}
对我来说似乎不对... else if
应该更像
else if ((this.Username.compareToIgnoreCase(object.Username) == 0) && (this.Password.compareTo(object.Password) == 0))
如果要满足Comparable
接口的合同,0
等于......
例如......
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;
public class Test {
private static ArrayList<Student> array = new ArrayList<Student>();
public static void main(String[] args) {
array.add(new Student("John", "password1"));
array.add(new Student("Jane", "password2"));
array.add(new Student("Jack", "password3"));
Student aStudent = new Student("Jack", "password3");
boolean found = false;
for (int i = 0; i < array.size(); i++) {
if (array.get(i).compareTo(aStudent) == 0) {
System.out.println(aStudent.equals(array.get(i)));
found = true;
break;
}
}
System.out.println(found);
}
public static class Student implements Comparable<Student> {
private String name;
private String password;
public Student(String name, String password) {
this.name = name;
this.password = password;
}
public String getName() {
return name;
}
public String getPassword() {
return password;
}
public void setName(String name) {
this.name = name;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public int compareTo(Student object) {
int result = 1;
if ((this.getName().compareToIgnoreCase(object.getName()) < 0) || (this.getPassword().compareTo(object.getPassword()) < 0)) {
result = -1;
} else if ((this.getName().compareToIgnoreCase(object.getName()) == 0) && (this.getPassword().compareTo(object.getPassword()) == 0)) {
result = 0;
}
return result;
}
}
}
哪个会打印出来......
false
true
对象不是equal
但是它们具有可比性......这对我来说有点奇怪......)
答案 1 :(得分:0)
您的问题可能在于您覆盖的compareTo函数,您需要包含该代码,否则无法确定为何返回某些值
编辑:
请注意,创建对象时,它们不一定完全相同,因为它们的包含值相等。它们是对象的单独实例,并按此处理。
您还需要覆盖equals函数,而不仅仅是compareTo函数,以获得您所寻求的结果。