4
    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();

$ そして、それは私の並べ替えステートメントが好きではありません: バウンドの不一致: Collections 型の汎用メソッド 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 を姓でソートし、リストを再度出力することです。

4

5 に答える 5

12

最初の問題については、問題はかなり単純です。oneNameは でありStringmyCelebrityListのコレクションです。CelebrityNamesFileこれは、タイプ のコレクションにのみオブジェクトを追加できることを意味しますCelebrityNamesFile

2 番目の問題については、クラスがインターフェイスCelebrityNamesFileを実装していないことが問題です。Comparable並べ替えには、リスト要素タイプの順序付けが実装されている必要があります。たとえばComparable、クラスに実装するか、 に を提供Comparatorsortます。

于 2012-07-18T00:24:39.770 に答える
2

String最初の問題では、インスタンスに を追加しようとしていList<CelebrityNamesFile>ます。String を使用してCelebrityNamesFileインスタンスを作成し、このインスタンスをリストに追加する必要があります。

CelebrityNamesFile celebrityNamesFile = new CelebrityNamesFile();
celebrityNamesFile.lastName = oneName;
myCelebrityList.add( celebrityNamesFile );

2番目の問題については、試してください

Collections.sort(myCelebrityList, new CompareLastName());

@alyu が指摘しているように、CelebrityNamesFileクラスは投稿しているコードを操作するためのインターフェイスを実装する必要Comparableがありますが、インスタンスを追加することもできComparator<CelebrityNamesFile>ます (そして、それを実装するクラスが既にありますCompareLastName)。

これについての詳細:

于 2012-07-18T00:25:24.240 に答える
1

Comparatorクラスに実装された は、クラスの外、または少なくともクラスのCompareLastName外に置くことができます。Comparator を実装するクラスをオブジェクト クラスの外に配置するまで、まったく同じ問題が発生していました。これを行った後、プログラムは完全に機能しました。役立つ場合は、コメント付きのコードのサンプルを次に示します。SortNamesCelebrityNamesFile

// 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;
    }
}

注: 私の回答は元の投稿から 1 年後のものですが、このサイトにアクセスして助けを求める人の役に立てば幸いです。

于 2013-10-26T05:54:48.790 に答える
1
  1. String(オブジェクトoneName) を のリストに追加しようとしていますCelebrityNamesFile。この から を何らかの方法で作成する必要がありCelebrityNamesFileますString
  2. Collections.sort()Comparable明示的にコンパレーターを渡さない場合のオブジェクトでのみ機能します。代わりにこれを試してください:

    Collections.sort(myCelebrityList, new CelebrityNamesFile.CompareLastName());

于 2012-07-18T00:26:21.680 に答える
1

コレクションmyCelebrityListは型CelebrityNamesFileであり、そのクラスのインスタンスのみを受け入れることができることを意味します。のインスタンスを作成CelebrityNamesFileしてコレクションに追加する必要があります。あなたのクラスはインターフェイスを実装していないCollectionsため、あなたのコレクションを受け入れません。コンパレータ インスタンスをas 2 番目のパラメータに渡す必要があります。CelebrityNamesFileComparatorCollections.sort()

于 2012-07-18T00:27:11.430 に答える