使用Comparable的compareTo将对象与arraylist中的元素进行比较

时间:2014-10-08 03:17:45

标签: java arraylist comparable compareto

我使用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;

    }

2 个答案:

答案 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函数,以获得您所寻求的结果。