1

概要

キーと値の 2 つのパラメーターを持つ複数の int 配列を保持する arrayList があります。(マップ ライブラリが存在することは知っていますが、このタスクでは arrayList を使用したいと考えています)。

私のarrayListに次の配列があると想像してください:

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

ご覧のとおり、それらはインデックス順に並べられています。これは、最初にそれらを arrayList に追加したときに行われます。

私の問題

このarrayListに配列を追加したい場合は、リストの最後に追加しますが、リスト内の正しい位置に追加したいのです。

私はarrayListsにかなり慣れていないので、私が遭遇していないこの問題に対するエレガントな解決策が存在するかどうか疑問に思っていました.

現在の考え

現在、私の解決策は、arrayListを反復処理し、すべての配列に対して一時的にキーを保存することです(array [0])。次に、もう一度反復して正しい位置に配列を追加します(キーが2つの間にある場合)他のキー)。

4

6 に答える 6

2

繰り返すというあなたの考えは正しいです。ただし、反復を2回実行する必要はありません。適切なインデックスを見つけて要素を挿入することは、1つのループで実行できます。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 に答える
2

Comparable以下に示すように、2つの値を保持し、実装を確実にするクラスを作成する方がよりエレガントな場合があります。

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 に答える
1

最初のオプション

配列をソートできるようにする場合は、ComparableObjectsを格納する必要があります。

したがって、2つの値の配列を保持し、Comparableインターフェイスを実装するクラスを作成できます。

このオプションを選択した場合、要素を追加した後は、を呼び出すだけ.sort()ですList

2番目のオプション

ソートに使用できるコンパレータを定義できます。これは再利用可能であり、2次元配列を保持することができます。また、追加するたびに並べ替える必要があります。

3番目のオプション

この特定の質問に示すように、その場でコンパレータを定義できます。 配列をソートするためのJavaコンパレータクラス

于 2013-03-12T15:32:22.717 に答える
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

次のことができます。

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

binarySearch とともに int[] の Comparator を使用します。

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 に答える