我可以在Java中定义自己的列表吗?
我有自己的列表类型类,与LinkedList
非常相似,称为PersonList
。
在另一个程序中,我使用的是Comparator
,因此我需要将List()
个对象作为参数。
如果我在代码中进行更改,是否可以发出以下声明?
List list1= new PersonList();
PersonList
不会扩展或导入任何内容。
答案 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
...
}
}
}
我没有测试过这个,所以我可能犯了一个错误,但你明白了。希望这会有所帮助,但我仍然可能误解了你想要做的事情。