1

Line オブジェクトを作成して配列リストに追加しようとしています。私が抱えている問題は、互いに類似している行を除外することです。2 つの行を比較して等しいかどうかを判断する equals メソッドを既に作成しました。while ループの使用に問題があります。エラーメッセージはありません。それはうまくコンパイルされます。テキストファイルから読み取れないだけです。私は立ち往生しており、ここから他にどこへ行くべきかわかりません。

public void read( File fileName ) throws Exception
{
    reader = new Scanner(fileName);


    //---------------------
    //Have to read the first number before starting the loop
    int numLines = reader.nextInt();
    lines = new ArrayList <Line> (numLines);

    //This loop adds a new Line object to the lines array for every line in the file read.
    while( reader.hasNext() ) {
        for( int i = 0; i < numLines; i++ ) {
            int x = reader.nextInt();
            int y = reader.nextInt();
            Point beg = new Point(x,y);
            x = reader.nextInt();
            y = reader.nextInt();
            Point end = new Point(x,y);

            String color = reader.next();

              Line l =  new Line( beg, end, color );

              if (l.equals(lines.get(i)))
                  break;
              else
                  lines.add(i, l);


        }
    }

    //Print the action to the console
    System.out.println( "reading text file: " + fileName );
    reader.close();

}
4

1 に答える 1

0

で発見することがたくさんありJava Collectionます。間違ったデータ構造を使用していますList。リストの目的は次のとおりであるため、 2 つの異なるオブジェクトを a に追加できます。

順序付きコレクション (シーケンスとも呼ばれます)。このインターフェースのユーザーは、各要素がリスト内のどこに挿入されるかを正確に制御できます。ユーザーは整数インデックス (リスト内の位置) で要素にアクセスし、リスト内の要素を検索できます。

したがって、オブジェクトを追加するときに保持される特定の順序で要素があり、この順序で任意のインデックスでオブジェクトにアクセスできます。

それはあなたが望むものではないようです。順序よりも重複する要素を持たないほうがよいでしょう。その場合は、次の目的を持つ Set インターフェイスを実装するクラスを使用する必要があります。

重複する要素を含まないコレクション。より正式には、セットには、e1.equals(e2) のような要素 e1 と e2 のペアが含まれず、最大でも 1 つの null 要素が含まれます。その名前が示すように、このインターフェイスは数学的集合の抽象化をモデル化します。

Java フレームワークには、セットの 2 つの実装が含まれています。

  • HashSet: これはハッシュ ベースの実装であり、コレクションのサイズに関係なく一定のアクセス時間を保証するハッシュの利点を享受します。
  • TreeSet: 基本操作に log(n) 時間を使用するツリー ベースの実装です。

私が提供した最初のリンクを調べることをお勧めします。これは、Java コレクションについて詳しく説明しているオラクルのチュートリアルです。

Set を使用した例

それは本当に簡単で、ArrayList を使用することからそれほど遠くありません。

  1. あなたの宣言をそのようなものに変更しますListSet私は a を使用しましたTreeSetが、 a の他の実装を使用できますSet):

    Set<Line> lines = new TreeSet<Line>();
    
  2. add(E e)コレクションにデータを入力したい場合は、インターフェイスの関数を使用してSet、それを実行させます。

     Line l = new Line(beg.x, beg.y, end.x, end.y);
     lines.add(l);
    

それでも使いたい場合はList

メソッドを使用して、要素がList(またはその他の重要な要素) にあるかどうかを確認できます。Collectioncontains(Object o)

  lines.contains(l)

新しく作成された ( ) がコレクション ( ) に含まれている場合、これは true をLine返しlますlines

于 2013-09-05T08:38:40.433 に答える