我正在尝试创建一个可以接受整数和数组的arrayList

时间:2015-11-02 18:48:46

标签: java generics arraylist

如何在Java中创建可接受整数和数组的通用数组列表?

[123,[],112,[],10]

6 个答案:

答案 0 :(得分:3)

int(整数包装器)和数组的公共基类都是Object。因此,使用对象类型创建ArrayList

ArrayList<Object> list= new ArrayList<Object>();

但是 不是正确的方法来解决这个问题,并且这里没有使用泛型来提高运行时的安全性。因此,重新设计您的程序并在单独的列表中分配每种类型或使用任何其他适当的Collection类型。

答案 1 :(得分:0)

嗯,最快的方法可能是创建一个由整数和数组组成的辅助对象,让你可以平等地使用两者

答案 2 :(得分:0)

使用具有int和数组作为其实例变量的类。然后创建一个ArrayList之类的

import java.util.ArrayList;

public class Hello {
    public static void main(String[]args) {
        ArrayList<Intarray> myArrayList = new ArrayList<Intarray>();

        int[] arr = {3,4,5};

        myArrayList.add(new Intarray(2,arr));
    }
}

class Intarray {
    private int numbers;
    private int[] myArray;

    public Intarray(int numbers, int[] myArray){
        this.numbers = numbers;
        this.myArray = myArray;
    }
}

答案 3 :(得分:0)

在“泛化”级别为列表中所需的所有对象创建数组列表。在这种情况下,即int和array,它是java.lang.Object。

这是我跑的一个小测试:

public static void main(String[] args) {
    List<Object> both = new ArrayList<Object>();
    both.add(1);
    both.add(args);
    System.out.println(both);
}

产地: [1,[Ljava.lang.String; @ 1db9742]

答案 4 :(得分:0)

正如@AbtPst建议的那样,最合适的解决方案是拥有一个列表列表。这可以通过许多不同的方式完成。就个人而言,我创建了一个包含两个构造函数的类。

class NumericElement
{
    private ArrayList<int> elements;

    public NumericElement(int newElement)
    {
        elements = new ArrayList<int>();
        elements.add(newElement);
    }

    public NumericElement(ArrayList<int> newElements)
    {
        elements = new ArrayList<int>(newElements); // copying array elements to the new array.
    }

    public ArrayList<int> getElements()
    {
        return elements;
    }
}

答案 5 :(得分:0)

您可以使用类型安全的界面定义List类,将不安全的List<Object>隐藏为内部实现细节。

这不仅仅是直接使用List<Object>。如果您的列表仅由一个类使用,则只需使用List<Object>作为该类的实现细节。 但是,如果您的列表不仅仅受到一个类的访问,请考虑使用此类型安全方法。

首先,定义一个可以表示int或int数组的接口。

public interface IScalarOrArrayInt { }

为每种可能的元素类型定义一个子接口:

public interface IScalarInt extends IScalarOrArrayInt { 
    public int getScalarInt();
}

public interface IArrayInt extends IScalarOrArrayInt {
    public int[] getIntArray();
}

然后定义列表类及其表示。它的界面可以是List<IScalarOrArrayInt>表示可以是List<Object>,因此您可以直接将Integer和int []对象放入其中,而无需包装对象。

public class ListOfScalarsAndArray extends AbstractList<IScalarOrArrayInt> {
    private static List<Object> m_list = new ArrayList<Object>();

AbstractList文档中所述,您需要定义几种允许修改列表的方法。您可以将它们委托给内部列表,但包装返回值。

@Override
public void add(int index, IScalarOrArrayInt element) {
    m_list.add( index, element );
}

@Override
public IScalarOrArrayInt remove(int index) {
    return wrap( m_list.remove( index ));
}

@Override
public IScalarOrArrayInt set(int index, IScalarOrArrayInt element) {
    return wrap( m_list.set( index, element ));
}

为方便来电者,您可以添加一些接受未解包的intint[]的方法。例如:

public void add( int element ) {
    m_list.add( element );
}

public void add( int[] element ) {
    m_list.add( element );
}

满足标准列表&lt;&gt;接口,可以包装返回值。您的类控制内部列表,因此它仅控制列表成员的可能类型。

private IScalarOrArrayInt wrap( Object o ) {
    if ( o instanceof Integer ) {
        final int i = (Integer) o;
        return new IScalarInt() {

            @Override
            public int getScalarInt() {
                return i;
            }
        };
    }
    else {
        assert( o instanceof int[] );

        final int[] a = (int[]) o;

        return new IArrayInt() {
            @Override
            public int[] getIntArray() {
                return a;
            }
        };
    }
}