我可以定义自己的java.util.List子类吗?

时间:2013-12-14 02:06:19

标签: java list

我可以在Java中定义自己的列表吗?

我有自己的列表类型类,与LinkedList非常相似,称为PersonList。 在另一个程序中,我使用的是Comparator,因此我需要将List()个对象作为参数。

如果我在代码中进行更改,是否可以发出以下声明?

List list1= new PersonList();

PersonList不会扩展或导入任何内容。

3 个答案:

答案 0 :(得分:4)

您需要implement内置界面java.util.List。它需要定义接口java.util.List中列出的所有方法。

答案 1 :(得分:2)

你只需要重载由每个人实现的equals函数 Type Object类(每个类)。由于OOP的多态概念,列表实现将使用您的equals实现。 我强烈建议使用给定的List实现,因为它们满足所有要求 你甚至没有想到的性能问题。如果遇到并发问题,请参阅文档。

为了实现自定义比较,您必须实现Comparable接口 并实现其方法toCompare(..);

通过这种方式,您可以使用所有给定的Collection API类并使用您自己的类扩展它们 比较或等于算法,满足您的应用需求。

更新至评论

class Person implements Compareable {

  @override
  public int compareTo(Person p) {
    return p.age > this.age; //Or whatever
 }


   @Override
   equals(Object person) {
   if (person instanceof Person) {

     Person p = (Person)person;
     if (p.x == this.x &&
        p.y == this.y &&
        p.address.equals(this.address) {
        ...
        return true;
     }
    }
    return false;
  }
}

现在只是初步确定你的名单。

List<Person> personList = new ArrayList<Person>();
or
List<Persin> personList = new Vector<Person>();
or
LinkedList<Person> personList = new Queue<Person>();

and and and.

Collections.sort(personList);

答案 2 :(得分:2)

要回答评论中的问题,“我将如何为链接列表编写自己的比较器?”:

public class PersonListComparator implements Comparator<LinkedList> {
    @Override
    public int compare(LinkedList list1, LinkedList list2) {
        // something that returns a negative value if list1<list2, 0 if list1 and
        // list2 are equal, a positive value if list1>list2.
    }
}

请参阅Comparator的javadoc,尤其是顶部的文字。这解释了当compare为假时list1.Equals(list2)函数返回0时可能发生的情况。这不一定是个问题,取决于你如何使用它。

请注意,我仍然假设您要比较整个列表(而不仅仅是单个Person)。根据以后的评论,看起来您想比较Person个对象,但提供不同的比较方法(“取决于所比较的不同参数”)。您可以定义多个实现Comparator<Person>的类。或者,您可以定义一个在构造对象时接受参数的类:

public enum ComparisonType { NAME, AGE, WEIGHT } // whatever

public class ComparePerson implements Comparator<Person> {
    private ComparisonType type;
    public ComparePerson(ComparisonType type) {
        this.type = type;
    }
    @Override
    public int compare(Person p1, Person p2) {
        switch(type) {
        case NAME:
            // return comparison based on the names
        case AGE: 
            // and so on
        ...
        }
    }
}

我没有测试过这个,所以我可能犯了一个错误,但你明白了。希望这会有所帮助,但我仍然可能误解了你想要做的事情。