13

こんばんは、

私は ArrayList (ld_data としてインスタンス化) を持っており、前方と後方の検索を繰り返し、要素データをユーザーに表示します。このプロセスでは、最初の要素にいるときと最後の要素にいるときを知る必要があります。私がそのように行う最後の要素にいるときを検出します:

if((index + 1) <= ld_data.size())
{
    ....
}

size プロパティが ArrayList の上限でもあるため、これが機能します。ただし、最初の要素にいることを検出するのは簡単ではありません。私が理解できた最高のものは、かなり不自由なように見えるこれです....しかし、それは機能します。

if((index - 1) >= (ld_data.size() - ld_data.size()))
{
    ....
}

C# .NET の世界では ArrayList.UpperBound または ArrayList.LowerBound がありますが、Java に似たようなものはありますか?

JB

編集:詳細。したがって、詳細については、ListView にバインドされています。したがって、ユーザーがリストの最初の要素までスクロールしたときに、「リストの開始時」というメッセージを表示し、最後に到達したときに「リストの終了」を表示したいと考えています。これを明確にするスクロールバーがあることは知っています。私がやっていることの例を挙げようとしています。したがって、このチェックは「OnScroll」イベントで発生します。

4

9 に答える 9

13

Iteratorsリストを使用またはListIterator反復することを常にお勧めします。リスト データを変更する (要素を削除または挿入する) 場合、リスト サイズを参照として使用しても効果がありません。

イテレータ- 呼び出し元がリストを一方向に反復処理し、明確に定義されたセマンティクスを使用して、反復中に基になるコレクションから要素を削除できるようにします

a を使用しListIteratorて、リストを反復処理できます。AListIteratorを使用すると、プログラマはリストをどちらの方向にもトラバースし、反復中にリストを変更し、リスト内の反復子の現在の位置を取得できます。以下の例を参照できます。

ArrayList<String> list = new ArrayList<String>();
    ListIterator<String> iterator = list.listIterator();
    while(iterator.hasNext()){
        System.out.println(iterator.next());
        ...
        ...
        System.out.println(iterator.previous());
        if(!iterator.hasPrevious()){
            System.out.println("at start of the list");
        }else if(!iterator.hasNext()){
            System.out.println("at end of the list");
        }

    }

これは の使用法を示す単なる例ListIteratorです。要件が何であるかを分析し、必要に応じて実装してください。

于 2012-06-07T05:39:10.787 に答える
9
List<YourData> list = new ArrayList<YourData>();

for(int index=0; index < list.size(); index++) {

    YourData currElement = list.get(index);

    if(index == 0) {
        //currElement is the first element
    }

    if(index == list.size() - 1) {
         //currElement is the last element
    }
}
于 2012-06-07T05:52:08.837 に答える
1

最初、最後、およびその間にあるものをさまざまな方法で処理するために、ロジックを抽象化したいようです。

以下に示すように、分解クラスを定義することでそれを行うことができます。

import java.util.*;

abstract class EndsDestructurer<A, B> {
  public abstract B first(A a);
  public abstract B intermediate(A a);
  public abstract B last(A a);

  public List<B> apply(List<A> xs) {
    int i = 0;
    int lastIndex = xs.size() - 1;
    List<B> ys = new ArrayList<B>();
    for (A x : xs) {
      if (i == 0) ys.add(first(x));
      else if (i == lastIndex) ys.add(last(x));
      else ys.add(intermediate(x));
      i++;
    }
    return ys;
  }
}

使用する:

EndsDestructurer<Object, String> stringer = 
  new EndsDestructurer<Object, String>() {
    public String first(Object o) { return "first: " + o; }
    public String intermediate(Object o) { return "intermediate: " + o; }
    public String last(Object o) { return "last: " + o; }
  };

List<Object> xs = Arrays.<Object>asList(90, "hello", 5.6, 12, "namaste", false);
System.out.println(stringer.apply(xs));

上記の出力:
[first: 90, intermediate: hello, intermediate: 5.6, intermediate: 12, intermediate: namaste, last: false].

于 2012-06-07T06:21:13.040 に答える
1

インデックスが 0 に等しいかどうかを確認するだけです。最初の要素は常にこのインデックスに存在します。

于 2012-06-07T05:31:27.593 に答える
1

ArrayLists の下部インデックスは常に 0 です。したがって、if (index > 0) { // okay to decrement }正常に動作します。

リスト反復子をリクエストすることもできます

ListIterator<Item> i = ld_data.listIterator();

if (i.hasNext()) {
    Item item = i.next();
}

// and

if (i.hasPrevious()) {
    Item item = i.previous();
}
于 2012-06-07T05:39:52.067 に答える
0

C# .NET の世界では ArrayList.UpperBound または ArrayList.LowerBound がありますが、Java に似たようなものはありますか?

Java の世界では、インデックス可能なコレクションの最初の要素のオフセットは常にゼロであるため、「下限」メソッドと「上限」メソッドは冗長になります。

定数を使用するだけ0です。

于 2012-06-07T06:35:18.393 に答える
0

私の知る限り、ArrayListクラスにはそのオブジェクトを与えるためのそのようなメソッドはありませんfirst and last element


次のようなコードを書くことができます。

ArrayList<String> arr = new ArrayList<String>();
int size = arr.size();
if(size==0)
{
    // no data
}
else if(size == 1)
{
    // first = arr.get(0);
    // last = arr.get(0);
}
else
{
    // first = arr.get(0);
    // last = arr.get(size-1);
}
于 2012-06-07T05:43:46.023 に答える
0

インデックスは常に 0 - myList.size() -1 になります。これは自明のように思えるので、おそらくあなたの質問を理解していないのではないかと思います。

于 2012-06-07T05:39:29.620 に答える