【问题标题】:I'm trying to create an arrayList that could accept both integers and array我正在尝试创建一个可以接受整数和数组的 arrayList
【发布时间】:2016-02-02 18:08:25
【问题描述】:

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

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

【问题讨论】:

  • 只需创建您的对象并添加数组和整数...有什么问题?
  • 另一种简单的方法是将 int 视为具有一个元素的列表。这样,您就可以拥有一个列表列表
  • 你能告诉我们你为什么需要这个吗?虽然您可以只使用ArrayList<Object>,但它可能表示设计气味。

标签: java generics arraylist


【解决方案1】:

嗯,最快的方法可能是创建一个由整数和数组组成的辅助对象,让您可以通过相等来使用两者

【讨论】:

  • 如果您添加一些代码来解释您的答案,这将非常有帮助。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 虽然这是达到预期效果的好方法;这需要一个整数和一个数组,我相信张贴者想要一个或......不是两者。
    【解决方案4】:

    在泛化级别为列表中需要的所有对象创建数组列表。在这种情况下,即对于 int 和数组,它是 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]

    【讨论】:

      【解决方案5】:

      正如@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;
          }
      }
      

      【讨论】:

        【解决方案6】:

        您可以使用类型安全接口定义List类,将不安全的List&lt;Object&gt;隐藏为内部实现细节。

        这比直接使用List&lt;Object&gt; 要多。如果您的列表仅由一个类使用,只需使用List&lt;Object&gt;,作为该类的实现细节。 但如果您的列表被多个类访问,请考虑使用这种类型安全的方法。

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

        public interface IScalarOrArrayInt { }
        

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

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

        然后定义您的列表类及其表示。它的接口可以是List&lt;IScalarOrArrayInt&gt;表示可以是List&lt;Object&gt;,这样就可以直接把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 );
        }
        

        为了满足标准的 List 接口,您可以包装返回值。您的类控制内部列表,因此它单独控制可能的列表成员类型。

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

        【讨论】:

          猜你喜欢
          • 2014-06-30
          • 2020-11-10
          • 1970-01-01
          • 1970-01-01
          • 2017-01-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多