在ArrayList中交换两个对象

时间:2013-03-09 21:54:13

标签: java generics arraylist wrapper file-handling

我正在尝试在ArrayList内交换2个对象。为实现此目的,我创建了一个交换对象的新列表,然后使用交换列表完全覆盖列表。但是,我无法将旧列表中的对象添加到新列表中。

程序从文本文件中获取输入,将数据读入对象(圆圈和矩形,这是GeometricObject的扩展名),然后将这些对象添加到名为ArrayList的{​​{1}}中

以下是代码:

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

3 个答案:

答案 0 :(得分: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: 以下内容将帮助您进行泛型中的操作。

你需要制作一个temp并将其强制转换为E.你还需要在正确的参数和/或形式/符号中使用以下代码。

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

如果您仍然遇到此交换功能的问题,请查看非通用的。

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

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分: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时,甚至不需要创建第二个数组列表。