2

内の 2 つのオブジェクトを交換しようとしていますArrayList。これを達成するために、オブジェクトが交換された新しいリストを作成し、古いリストを完全に交換されたリストで上書きします。ただし、古いリストから新しいリストにオブジェクトを追加するのに問題があります。

このプログラムは、テキスト ファイルから入力を取得し、データをオブジェクト ( の拡張である円と四角形) に読み取り、GeometricObjectそれらのオブジェクトをArrayList呼び出された に追加しますobjectList

コードは次のとおりです。

public static <E extends Comparable<E>> void swapCells
(ArrayList<E> objectList, int left, int right) {

    /* The user may enter the two indices, "left,"
     * and, "right," in any order which they desire.
     * Because of this it will be necessary to determine
     * which is larger or "right" index, and which is
     * the smaller or "left" index
     */

    int temp;
    ArrayList<GeometricObject> swappedList = new ArrayList<GeometricObject>();

    if (left > right) {

        // Exchanges left and right
        temp = left;
        left = right;
        right = temp;

    }

    for (int i = 0; i < objectList.size(); i++) {

        if (i == left) {
            swappedList.add(objectList.get(right));
            System.out.println( swappedList.get(i).getArea());
        } else {
            swappedList.add((E) objectList.get(i));

        }

    }

} // End of swapCells

次の構文エラーが発生しましたが、どうすればよいかわかりません。

add(GeometricObject)型のメソッドArrayList<GeometricObject>は引数に適用できません(E)

エラーは具体的には、swappedList.add(objectList.get(right));およびwappedList.add((E) objectList.get(i));です。

4

3 に答える 3

1

これがまさにあなたが探している答えだとは思いませんが、役立つかもしれません。

GeomtricObject で型キャストすると、機能するコードが得られますが、ジェネリックをジオメトリ オブジェクトに強制するだけの場合は、ジェネリックを使用する目的が無効になります。

左のオブジェクトを右の位置にスワップするには、else if も追加する必要があります。

また、swappedList を出力して、アクションが完了したことを確認することもできます。

        for (int i = 0; i < objectList.size(); i++) 
            {
                if (i == left) {
                    swappedList.add((GeometricObject) objectList.get(right));
                }else if (i == right)
                    swappedList.add((GeometricObject) objectList.get(left));
                else {
                    swappedList.add((GeometricObject) objectList.get(i));
            }
        }

編集2:以下は、ジェネリックで探していた操作に役立ちます。

temp を作成して E にキャストする必要があります。次のコードも正しい引数および/または形式 / 表記で使用する必要があります。

        E temp
        List.set(____ , _____)
        List.get(____ )

このスワップ機能でまだ問題がある場合は、ジェネリックではないものを見てください。

EDIT 3: 私と同じ問題を抱えている可能性が高く、ジェネリックをソートする必要もあります。以下の selectionSort メソッドを使用して、割り当てに役立てることができます。Array ではなく ArrayList に対して機能するようにメソッドを変更する必要があります。これは、以下のコードを変更するには、EDIT 2 の提案を利用する必要があることを意味します。また、compareTo メソッドを使用する必要がある場合もあります。

        private static void selectionSort(int[] list, int low, int high) { 
        if (low < high) { 
          int posMax = high; 
          int theMax = list[high]; 
          for (int i = 0; i < high; i++) { 
            if (list[i] > theMax) { 
              theMax = list[i]; 
              posMax = i; 
            }// if 
          }// for 
        list[posMax] = list[high]; 
        list[high] = theMax; 
        selectionSort(list, low, high - 1); 
        }// if 
    }
于 2013-03-12T04:14:36.530 に答える
0

まず、この質問に答えてくれたすべての人に感謝したいと思います。先週のオフィスアワーで先生に相談しました。私の先生は、コードを書く前に、何が問題なのかを頭の中で描いてもらい、それから、使用するプロセスを紙と鉛筆に物理的に描いてもらいました。最後にコードを書いた後、ここに解決策があります:

public static <E extends Comparable<E>> void swapCells
(ArrayList<E> objectList, int left, int right) {

    /*
     * Create a temporary generic object so that the left and
     * right objects can be swapped without losing any data.
     */
    E temp = objectList.get(left);

    // Place the right object into the left position
    objectList.set(left, objectList.get(right));

    /*
     * Place the temporary (left) object into the right
     * position.
     */
    objectList.set(right, temp);

} // End of swapCells

単純に一時オブジェクト E を使用できる場合、2 番目の配列リストを作成する必要さえありませんでした。

于 2013-03-27T00:14:31.250 に答える
0

Eのリストにオブジェクトを追加しようとしていますGeometricObject。そのため、エラーが発生します。リストswappedListのタイプArrayList<E>は 、またはそれ以上である必要があります: List<E>

一方、関数の型を次のように変更できます。

public static void swapCells(ArrayList<GeometricObject> objectList, int left, int right)

ああ、あなたが構築したこのリストで何かをしてください。現在のコードはそれを破棄するだけです。

于 2013-03-09T22:11:13.400 に答える