我有一个具有两个类的系统:Book和Member。我试图做一个可以接受两个类的ArrayList的排序方法,并在返回给我之前对它们进行排序。这是我编写代码的方式:
public static <T> ArrayList sortElements(Class c, ArrayList<T> elementList) {
if (c == Book.class) {
ArrayList<Book> bookList = new ArrayList<>();
for (Object o: elementList) {
Book book = (Book) o;
bookList.add(book);
}
boolean isBookSorted = false;
Book bookTemp = null;
while (!isBookSorted) {
isBookSorted = true;
for (int i = 0; i < bookList.size() - 1; i++) {
if ((bookList.get(i).getBookTitle()).compareToIgnoreCase(bookList.get(i+1).getBookTitle())>0) {
bookTemp = bookList.get(i);
bookList.set(i, bookList.get(i+1));
bookList.set(i+1, bookTemp);
isBookSorted = false;
}
}
}
return bookList;
}
if (c == Member.class) {
ArrayList<Member> memberList = new ArrayList<>();
for (Object o: elementList) {
Member member = (Member) o;
memberList.add(member);
}
boolean isMemberSorted = false;
Member memberTemp = null;
while (!isMemberSorted) {
isMemberSorted = true;
for (int i = 0; i < memberList.size() - 1; i++) {
if ((memberList.get(i).getMemberName()).compareToIgnoreCase(memberList.get(i+1).getMemberName())>0) {
memberTemp = memberList.get(i);
memberList.set(i, memberList.get(i+1));
memberList.set(i+1, memberTemp);
isMemberSorted = false;
}
}
}
return memberList;
}
return elementList;
}
[当我使用此方法时,它向我显示警告:未选中的分配:从'java.util.ArrayList'到'java.util.ArrayList'。有没有更好的方法可以以通用方式实现sort方法,但仍然可以在类内部使用该方法?因为我需要分别访问Book.getBookTitle()和Member.getMemberTitle()才能进行排序。
编写单个函数来处理两个不相关的类的并集作为参数在Java中很尴尬,而不是通常如何解决这样的问题。在Java中,可以使用方法重载来指定两个具有相同名称但参数类型不同的不同函数。
但是对于特定的排序方式,在Java中指定排序顺序的通常方式是实现可比较的接口。然后,您可以使用本机Java排序方法,例如Arrays.sort()
或java.util.Collections.sort()
。
您创建一种用于对成员和书籍列表进行排序的方法的整个想法都是有缺陷的。
或者书籍和成员具有明确的属性,可以比较它们并对其进行排序(使用Collections.sort
或使用SortedSet
),或者您需要特定的方法,例如sortBooksOnTitle(List<Book> books)
。
想象下一个程序员,看到一个generic排序方法,并发现它根据类输入在排序方法之间切换。这肯定是在使最不惊奇的原则失效。