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

您可能还想打印出 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:以下内容将帮助您进行您在泛型中寻找的操作。

您将需要创建一个临时并将其转换为 E。您还需要在其正确的参数和/或形式/符号中使用以下代码。

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

如果您仍然无法使用此交换功能,请查看不是通用的。

编辑 3:您很可能遇到与我相同的问题,并且您还需要对 Generic 进行排序。您可以使用下面的 selectionSort 方法来帮助您完成作业。您需要更改方法,使其适用于 ArrayList 而不是 Array。这意味着您将需要使用 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

您正在尝试将E对象添加到GeometricObject. 这就是你得到错误的原因。您的列表swappedList应该是 type ArrayList<E>,或者更好:List<E>.

另一方面,您可以将函数的类型修改为:

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

哦,对你建立的这个列表做点什么。您当前的代码只是丢弃它。

于 2013-03-09T22:11:13.400 回答
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 时,甚至不需要创建第二个数组列表。

于 2013-03-27T00:14:31.250 回答