import java.io.BufferedReader;
import java.util.Collections;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import com.javaranch.common.TextFileIn;
public class SortNames
{
public static class CelebrityNamesFile
{
public String firstName;
public String lastName;
public static class CompareLastName implements Comparator< CelebrityNamesFile >
{
@Override
public int compare( CelebrityNamesFile o1, CelebrityNamesFile o2 )
{
return o2.lastName.compareTo( o1.lastName );
}
}
public static void main( String[ ] args ) throws IOException
{
ArrayList< CelebrityNamesFile > myCelebrityList;
myCelebrityList = new ArrayList< CelebrityNamesFile >();
TextFileIn celebrityNamesFile = new TextFileIn( "celebrityNamesFile.txt" );
boolean doneReadingCelebrityNames = false;
while ( ! doneReadingCelebrityNames )
{
String oneName = celebrityNamesFile.readLine();
if ( oneName == null )
{
doneReadingCelebrityNames = true;
}
$ Eclipse不喜欢下面的add语句,例如:类型ArrayList(SortNames.CelebrityNamesFile)中的方法add(SortNames.CelebrityNamesFile)不适用于参数(String)
else
{
myCelebrityList.add( oneName );
}
}
celebrityNamesFile.close();
$ 然后它不喜欢我的排序声明,即: 绑定不匹配:类型集合的泛型方法sort(List T)不适用于参数(ArrayList(SortNames.CelebrityNamesFile))。推断类型SortNames.CelebrityNamesFile不是有界参数的有效替代(T extends Comparable(?super T))
Collections.sort( myCelebrityList );
System.out.println( myCelebrityList );
Collections.sort( myCelebrityList, new CelebrityNamesFile.CompareLastName() );
System.out.println( myCelebrityList );
}
}
}
我做错了什么?我在这里阅读了很多帖子,阅读了有关比较器的Java文档,阅读了有关比较器的Java教程。 Head First Java,Ivor Horton开始使用Java 7.仍然无能为力。
程序的目的是从txt文件中读取名称,将它们添加到arraylist中,按照其自然顺序打印arraylist,按姓氏对arraylist进行排序,再次打印列表。
答案 0 :(得分:12)
对于第一个问题,问题非常简单。 oneName
是String
,myCelebrityList
是CelebrityNamesFile
的集合 - 这意味着您只能将对象添加到CelebrityNamesFile
类型的集合中。
对于第二个问题,您的问题是CelebrityNamesFile
类没有实现Comparable
接口。排序要求对列表元素类型实施排序,例如,通过为班级实施Comparable
或向Comparator
提供sort
。
答案 1 :(得分:2)
对于第一个问题,您尝试将String
添加到List<CelebrityNamesFile>
实例中。您可以使用String创建CelebrityNamesFile
实例并将此实例添加到列表中:
CelebrityNamesFile celebrityNamesFile = new CelebrityNamesFile();
celebrityNamesFile.lastName = oneName;
myCelebrityList.add( celebrityNamesFile );
对于第二个问题,请尝试
Collections.sort(myCelebrityList, new CompareLastName());
正如@alyu指出的那样,CelebrityNamesFile
类需要实现Comparable
接口来处理您发布的代码,但您也可以添加Comparator<CelebrityNamesFile>
实例(和您一样)已经拥有实现它的CompareLastName
类。)
更多相关信息:
答案 2 :(得分:1)
String
(对象oneName
)添加到CelebrityNamesFile
列表中。您需要以某种方式从此CelebrityNamesFile
创建String
。 Collections.sort()
仅适用于Comparable
的对象。试试这个:
Collections.sort(myCelebrityList, new CelebrityNamesFile.CompareLastName());
答案 3 :(得分:1)
集合myCelebrityList
的类型为CelebrityNamesFile
,这意味着它只能接受该类的实例。您需要创建CelebrityNamesFile
的实例并将其添加到集合中。 Collections
不会接受您的收藏,因为您的课程CelebrityNamesFile
未实施Comparator
界面。您需要将比较器实例作为第二个参数传递给Collections.sort()
。
答案 4 :(得分:1)
Comparator
类中实现的CompareLastName
可以放在SortNames
类之外,或者至少放在CelebrityNamesFile
类之外。我有完全相同的问题,直到我把实现我的Comparator的类放在我的对象类之外。在我这样做之后,程序运行得很好。以下是我的代码示例,如果有帮助,请附上评论。
// Comparator interface for my Word Class.
public interface Comparator<Word>
{
int compare(Word first, Word second);
}
// Word Class, which is my object.
public class Word
{
private String word;
public Word(String input) { word = input; }
public String get() { return word; }
public int wordSize() { return word.length(); }
}
// Comparator implementation is separate from my Word Class.
public class WordComparator implements Comparator<Word>
{
public int compare(Word first, Word second)
{
if (first.wordSize() < second.wordSize()) { return -1; }
else if (first.wordSize() > second.wordSize()) { return 1; }
else { return first.get().compareTo(second.get()); }
}
}
// Now run the program to ensure the Word Class objects and the WordComparator
// Class are implemented correctly.
public class WordComparatorDemo
{
public static void main(String[] args) throws FileNotFoundException
{
ArrayList<Word> list = new ArrayList<Word>();
JFileChooser find = new JFileChooser();
Scanner read = null;
if(find.showOpenDialog(null) == JFileChooser.APPROVE_OPTION)
{
File selectedFile = find.getSelectedFile();
read = new Scanner(selectedFile);
try
{
list = inputData(read);
// Here's the sort implementing the WordComparator.
Collections.sort(list, new WordComparator());
}
finally { read.close(); }
}
}
public static ArrayList<Word> inputData(Scanner in)
{
ArrayList<Word> list = new ArrayList<Word>();
in.useDelimiter("[^A-Za-z]+");
while(in.hasNext())
{
String word = in.next();
Word temp = new Word(word);
list.add(temp);
}
return list;
}
}
注意:我的回答是在原帖后一年,但希望它能帮助访问此站点的任何人寻求帮助。