我有两个ArrayLists,teamList1和teamList2,每个都包含五个Team对象。我正在用我的一种方法将这些内容相互比较。我必须将这两个ArrayLists作为单个2元素简单数组参数Objects []传入方法。我收到编译错误,因为我正在努力从类型对象转换为类型Team。换句话说,从Collection更改为简单数组回到Collection会给我一个错误。任何人都有关于我的投射错误的提示吗?
CommonElements.java
package test;
import javax.swing.*;
import java.util.*;
public class CommonElements {
List<Comparable> teamList1 = new ArrayList<Comparable>();
List<Comparable> teamList2 = new ArrayList<Comparable>();
List<Comparable> commonList = new ArrayList<Comparable>();
Object[] listCollection = new Object[2];
int comparisonCount;
public static void main(String[] args) {
new CommonElements();
}
public CommonElements() {
comparisonCount = 0;
Team a = new Team("Boston");
Team b = new Team("Seattle");
Team c = new Team("Newark");
Team d = new Team("Houston");
Team e = new Team("Salt Lske City");
teamList1.add(a);
teamList1.add(b);
teamList1.add(c);
teamList1.add(d);
teamList1.add(e);
Team f = new Team("Seattle");
Team g = new Team("Nashville");
Team h = new Team("St. Louis");
Team i = new Team("New York");
Team j = new Team("Boston");
teamList2.add(f);
teamList2.add(g);
teamList2.add(h);
teamList2.add(i);
teamList2.add(j);
listCollection[0] = teamList1;
listCollection[1] = teamList2;
findCommonElements(listCollection);
System.out.println(comparisonCount);
}
public Comparable[] findCommonElements(Object[] collections)
{
ArrayList<Object> objectTeam1 = new ArrayList<Object>(Arrays.asList(collections[0]));
ArrayList<Object> objectTeam2 = new ArrayList<Object>(Arrays.asList(collections[1]));
ArrayList<Team> team1 = (ArrayList)objectTeam1;
ArrayList<Team> team2 = (ArrayList)objectTeam2;
Team[] commonList = new Team[5];
int i = 0;
for(Team x:team1)
{
for(Team y:team2)
{
comparisonCount++;
if(x.compareTo(y) == 0)
{
commonList[i] = x;
System.out.println(commonList[i].teamName);
i++;
break; /*to ensure it looks for only one match per entry*/
}
}
}
return commonList;
}
public int getComparisons()
{
return comparisonCount;
}
}
Team.java
package test;
public class Team implements Comparable<Team> {
String teamName = new String();
public void setName ( String n ) {
teamName = n;
}
public Team(String n) {
setName(n);
}
public int compareTo(Team x)
{
if(this.teamName.equals(x.teamName))
{
return 0;
}
else
{
return -1;
}
}
}
答案 0 :(得分:3)
这是传递论据的一种非常不幸和奇怪的方式,但无论如何,为了使其有效,你可以这样做:
@SuppressWarnings("unchecked")
ArrayList<Team> team1 = (ArrayList<Team>)collections[0];
@SuppressWarnings("unchecked")
ArrayList<Team> team2 = (ArrayList<Team>)collections[1];
您现有的代码正在使用每个ArrayList,将其放入一个元素数组中,将该数组包装为一个列表,从中创建一个ArrayList,并尝试将ArrayList<ArrayList<Team>>
视为ArrayList<Team>
。
我看到的其他一些事情......如果你只是使用它们添加到列表中,你不需要将它们分配给变量:
Team a = new Team("Boston");
...
teamList1.add(a);
您可以这样做:
teamList1.add(new Team("Boston"));
您不需要单独创建listCollection
数组,因为您可以在传递参数时以内联方式创建它:
findCommonElements(new Object[] { teamList1, teamList2 });
在你的Team类中,这个:
String teamName = new String();
应该只是:
String teamName;
在compareTo方法中:
public int compareTo(Team x)
{
if(this.teamName.equals(x.teamName))
{
return 0;
}
else
{
return -1;
}
}
应该是:
public int compareTo(Team x)
{
return teamName.compareTo(x.teamName);
}
更短,并尊重所有x和y sgn(x.compareTo(y)) == -sgn(y.compareTo(x))
的{{3}}。