1

概述

我有一个 arrayList 包含多个 int 数组,这些数组有两个参数,键和值。(我知道存在一个地图库,但对于这个任务我希望使用一个数组列表)。

想象一下我的 arrayList 有以下数组:

[3, 99][6, 35][8, 9][20, 4][22, 13][34, 10]

如您所见,它们按索引排列,这是我第一次将它们添加到 arrayList 时完成的。

我的问题

如果我想向这个 arrayList 添加一个数组,它将附加到列表的末尾,而我想将它添加到列表中的正确位置。

我对arrayLists 相当陌生,因此想知道是否存在一个我没有遇到过的优雅解决方案来解决这个问题。

目前的想法

目前,我的解决方案是遍历arrayList,然后为每个数组临时存储键(array [0]),然后我将再次迭代并将我的数组添加到正确的位置(其中键在两个之间其他键)。

4

6 回答 6

2

生成一个类来保存您的两个值并确保 implements 可能更优雅Comparable,如下所示:

public class Foo implements Comparable<Foo> {

  private int x; // your left value
  private int y; // your right value

  // Constructor and setters/getters omitted

  public int compareTo(Foo o) {
    return Integer.compare(x, o.getX());
  }
}

然后添加和排序如下:

List<Foo> listOfFoos = new ArrayList<Foo>;
// ...
listOfFoos.add(new Foo(33,55));
Collections.sort(listOfFoos);   

那将是最易读的解决方案。可能有更快的选择,但只有在你能证明这部分是瓶颈的情况下才进行优化。

于 2013-03-12T15:32:11.997 回答
2

您的迭代想法是正确的;但是不需要执行两次迭代。找到正确的索引并插入元素可以在一个循环中完成。ArrayList 有一个方法add(int, E)可以将元素插入到列表中的任何位置。试试这个:

//the value you want to insert
int[] toInsert = {someValue, someOtherValue};

//assume theList is the list you're working with
for(int index = 0; index < theList.size() -1; index ++)
{
     int key = theList.get(index)[0];
     int nextKey = theList.get(index + 1)[0];

     //if we've reached the correct location in the list
     if (toInsert[0] > key && toInsert[0] < nextKey)
     {
          //insert the new element right after the last one that was less than it
          theList.add(index + 1,toInsert);
     }
}

请注意,此方法假定列表已排序开始。如果您想保证这一点,请查看描述排序和Comparators 的其他一些答案。

于 2013-03-12T15:33:07.603 回答
1

第一个选项

如果您希望能够对数组进行排序,则应该存储Comparable Objects。

因此,您可以创建一个 Class 来保存您的两个值数组并实现 Comparable 接口。

如果您选择此选项,则在添加元素后,您需要做的就是调用.sort()您的List.

第二种选择

您可以定义可用于排序的比较器。这将是可重用的,并允许您保留二维数组。您还必须在每次添加后进行排序。

第三个选项

您可以动态定义 Comparator,如以下特定问题所示: Java Comparator class to sort arrays

于 2013-03-12T15:32:22.717 回答
0

您可以执行以下操作:

import java.util.ArrayList;

   public class AddElementToSpecifiedIndexArrayListExample {

  public static void main(String[] args) {
//create an ArrayList object
  ArrayList arrayList = new ArrayList();

//Add elements to Arraylist
   arrayList.add("1");
   arrayList.add("2");
   arrayList.add("3");

/*
  To add an element at the specified index of ArrayList use
  void add(int index, Object obj) method.
  This method inserts the specified element at the specified index in the
  ArrayList.  
*/
arrayList.add(1,"INSERTED ELEMENT");



System.out.println("ArrayList contains...");
for(int index=0; index < arrayList.size(); index++)
  System.out.println(arrayList.get(index));

    }
}

/* 输出将是 ArrayList 包含... 1

插入元素

2

3

*/

于 2013-03-12T15:32:33.547 回答
0

还有一个版本add采用添加新项目的索引。

int i;
for(i=0; i<arr.size(); i++){
    if(arr.get(i)[0] >= newArr[0]){
        arr.add(i, newArr);
    }
}
if(i == arr.size())
    arr.add(i, newArr)
于 2013-03-12T15:33:51.603 回答
0

使用 int[] 的 Comparator 和 binarySearch :

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class Main
{

    public static void main(String[] argv)
    {
        ArrayList<int[]> list = new ArrayList<int[]>();

        list.add(new int[] { 3, 99 });
        list.add(new int[] { 6, 35 });
        list.add(new int[] { 8, 9 });
        list.add(new int[] { 20, 4 });
        list.add(new int[] { 22, 13 });
        list.add(new int[] { 34, 10 });

        Compar compar = new Compar();

        addElement(list, new int[] { 15, 100 }, compar);


        for(int[] t : list)
        {
            System.out.println(t[0]+" "+t[1]);
        }

    }

    private static void addElement(ArrayList<int[]> list, int[] elem, Compar compar)
    {
        int index = Collections.binarySearch(list, elem, compar);

        if (index >= 0)
        {
            list.add(index, elem);
            return;
        }

        list.add(-index - 1, elem);
    }

    static class Compar implements Comparator<int[]>
    {
        @Override
        public int compare(int[] a, int[] b)
        {
            return a[0] - b[0];
        }
    }
}
于 2013-03-12T15:40:41.463 回答