我正在尝试在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));
。
答案 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时,甚至不需要创建第二个数组列表。