如何在非连续索引中将元素添加到ArrayList中

时间:2018-02-04 00:36:50

标签: java arraylist

我尝试使用非连续索引向Arraylist中添加元素,例如:

我想在索引(0,1,2)添加任何元素之前先在索引3处添加一个元素。我也会在0,1,2之后填写索引。

这是我的代码:

public static void main(String[] args) throws FileNotFoundException {

    List<Integer> numbers= new ArrayList<Integer>();

 Scanner inp = new Scanner(System.in);

 int[] x = {1,5,2,4,3,0};

 System.out.println("Enter elements:"+"\n");
 for(int i=0;i<x.length;i++) {

     int index = x[i];
         numbers.add(index, inp.nextInt());

 }

我似乎得到了这个错误:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 0
at java.util.ArrayList.rangeCheckForAdd(Unknown Source)
at java.util.ArrayList.add(Unknown Source)
at Test1.main(Test1.java:28)

我理解错误,但我似乎找不到解决这个问题的方法。任何帮助都感激不尽。如果有另一个花哨的数据结构允许我进行非连续索引,请告诉我,如果我的问题没有任何意义,请原谅。

2 个答案:

答案 0 :(得分:3)

您是否考虑过使用Map

Map<Integer,Integer> myNumbers = new HashMap<>();
myNumbers.put( 4, 100 );
myNumbers.put( 2, 199 );
myNumbers.put( 1, 150 );
System.out.println( myNumbers.get( 2 ) );

Map有多种实现,例如HashMapTreeMap。哪一个取决于您的要求,例如,如果您想按特定顺序存储元素,或者您不关心订单。

在您的用例中,Map可以像这样使用:

int[] x = { 1,5,2,4,3,0 };
// Try this instead of the above array, as well:
//int[] x = { 1337, 42, 777 };

// The Map can take an (almost) unlimited number of entries and gaps between 
// indices / keys (e.g. 0, 1, 7, 23) are no problem. Only elements that you
// *put* into the Map, are part of it.
Map<Integer,Integer> numbersMap = new TreeMap<>();

System.out.println( "Enter elements:\n" );
try( Scanner inp = new Scanner( System.in ) ) {
    for( int i=0; i<x.length; i++ ) {
        int index = x[i];
        System.out.print( "Enter element " + index + ": " );
        int userInput = inp.nextInt();
        numbersMap.put( index, userInput );
    }
}

System.out.println( "Your Map contains these entries:" );
for( Map.Entry<Integer,Integer> entry : numbersMap.entrySet() ) {
    System.out.println( "Element[" + entry.getKey() + "] = " + entry.getValue() );
}

由于x数组中的索引是连续的,没有间隙,从零开始并且事先已知,所以在这种特殊情况下你也可以使用类似的东西:

int[] x = { 1,5,2,4,3,0 };
Integer[] output = new Integer[ x.length ];

System.out.println( "Enter elements:\n" );
try( Scanner inp = new Scanner( System.in ) ) {
    for( int i=0; i<x.length; i++ ) {
        int index = x[i];
        System.out.print( "Enter element " + index + ": " );
        int userInput = inp.nextInt();
        output[ index ] = userInput;
    }
}

List<Integer> numbers = Arrays.asList( output );

System.out.println( numbers );

但我更喜欢Map方法,因为它更灵活,更不容易出错。

答案 1 :(得分:1)

你有一个arraylist,但你似乎忘记了你还没有设置arraylist的初始大小。你使用的add方法将值放在给定的索引处,然后将所有内容移到右边,但在这种情况下,没有索引1.为了做到这一点,你应该做

List<Integer> numbers= Arrays.asList(new Integer[10]),

将生成一个带有10&#34;索引&#34;的arrayList。其值为null,或

ArrayList<Integer> arr=new ArrayList<Integer>(Collections.nCopies(10, 0));,

将创建带有10&#34;索引的anarrayList&#34;每个值都为0.有关更多信息,请查看您间接询问的这个问题。 Initial size for the ArrayList