从ArrayList <object>转换为我自己的类</object>

时间:2014-10-09 03:23:26

标签: java arraylist

我有两个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;
        }
    }


}

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}}。