【问题标题】:Swapping Two Objects In An ArrayList交换 ArrayList 中的两个对象
【发布时间】:2013-03-09 21:54:12
【问题描述】:

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

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

代码如下:

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

我收到以下语法错误,不知道该怎么办。

ArrayList&lt;GeometricObject&gt; 类型中的方法add(GeometricObject) 不适用于参数(E)

错误具体在swappedList.add(objectList.get(right)); 和wappedList.add((E) objectList.get(i));。

【问题讨论】:

    标签: java generics arraylist wrapper file-handling


    【解决方案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: 以下内容将帮助您完成您在泛型中寻找的操作。

    您需要创建一个临时文件并将其转换为 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 
        }
    

    【讨论】:

      【解决方案2】:

      您正在尝试将E 对象添加到GeometricObject 列表中。这就是你得到错误的原因。您的列表swappedList 的类型应为ArrayList&lt;E&gt;,或更好:List&lt;E&gt;。

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

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

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

      【讨论】:

      • 最后一部分是什么意思?
      • 对象 swappedList 不会由您的 swapCells 函数返回,也不会放入其他变量中。因此,它会在函数体的末尾消失。
      • 当我将交换列表转换为 类型时,它使我强制转换为使用我的 GeometricObject 函数。我不再那么喜欢这种方式了,还有其他方法吗?我想添加和删除到原始 objectList 会起作用,但还有其他什么吗?
      • 是的,因为我挂了,我打算让 objectList 等于 swappedList,完全替换 objectList。整个事情似乎有些不对劲,比如我让它变得比应该的更难......
      • 不使用泛型类型,您可以将swapCells的类型更改为:public static void swapCells(ArrayList&lt;GeometricObject&gt; objectList, int left, int right)
      【解决方案3】:

      我首先要感谢所有为回答这个问题做出贡献的人。上周的某个时候,我向老师咨询了办公时间。在编写代码之前,我的老师让我在脑海中画出问题所在,然后在纸和铅笔上画出要使用的过程的实物图。最后写完代码,解决方法如下:

      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 时,甚至不需要创建第二个数组列表。

      【讨论】:

        猜你喜欢
        • 2011-10-19
        • 1970-01-01
        • 1970-01-01
        • 2020-07-24
        • 1970-01-01
        • 2020-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多