2011-06-20 7 views
9

でリストに移動します。Javaリスト:識別子の次または前の要素を取得する

-1私はリストを管理/作成しています。

2 - 私は私のリストから識別子要素の次の項目を取得する関数を作成

あなたは私には、このコードを修正するのに役立つことはできますか?

あなたの要素が繰り返されていない場合は、リストに

List<String> myList = new ArrayList<String>(); 
myList.add("1"); 
myList.add("2"); 
myList.add("3"); 
myList.add("4"); 
myList.add("5"); 


public String function getNext(String uid) { 

    if (myList.indexOf(uid).hasNext()) { 
     return myList.indexOf(uid).nextElement(); 
    } 
    return ""; 
} 

public String function getPrevious(String uid) { 
    return myList.indexOf(uid).hasPrevious() ? myList.indexOf(uid).previousElement() : ""; 
} 

答えて

10

文字列を検索するためにインデックスを使用することもできますが、関数を実装したままで、より高速で簡単です。 List.get(i)を使用して

public String getNext(String uid) { 
    int idx = myList.indexOf(uid); 
    if (idx < 0 || idx+1 == myList.size()) return ""; 
    return myList.get(idx + 1); 
} 

public String getPrevious(String uid) { 
    int idx = myList.indexOf(uid); 
    if (idx <= 0) return ""; 
    return myList.get(idx - 1); 
} 

は最速のオプションインデックスを保ちますどのO(1)です。 List.indexOf(String)O(n)です。 NavigatbleSetを使用すると、O(log n)のように魅力的に見えるかもしれませんが、オブジェクトを作成するコストは非常に高く、利点が見られる前にコレクションをかなり大きくする必要があります。 (その場合は、最初のオプションを使用します)

+1

非常にエレガントな解決策 –

+0

* indexOf *は* O(n)*操作ですが、それだけで+1に注意してください。 – SyntaxT3rr0r

+0

@ SyntaxT3rr0r、良い点。これは、 'List.get(int)'が 'O(1)'なので、インデックスを保持する方が良い理由は、コードを単純化するかもしれないからです。 –

1

を準備するには、何が必要のNavigableSetです:

http://download.oracle.com/javase/6/docs/api/java/util/NavigableSet.html

方法higherlowerあなたが探しているものです。

+0

NavigableSetはSortedSetを継承します。これはOPの後ではありません:NavigableSetは、ソートされた順番で次の要素を挿入する必要があります。 OPは、Peter Lawreyが答えとして与えたものである:挿入順序の次/前の要素を彼に与える方法。 – SyntaxT3rr0r

+0

@ SyntaxT3rr0rこの例の要素は、繰り返しなしで辞書順に挿入されているので、本当に必要なものがソートされたセットだったときに、リストを使用するのが間違っているという正当な前提がありました。ハンマー、すべてが爪のように見える。 – fortran

+0

すべてのOPがハンマーであることを知っていることを暗示しようとしているのですか?それは非常に失礼なことでしょう。また、ハンマー以上のものを使用しているときとそうでないときは、ハンマー以外のものを知っているあなたが知りません。偽の答えは偽の答えです:あなたの好意でこれをひねりません。 – SyntaxT3rr0r

1

リストにはnextElement()メソッドがありません。 indexOfは、アイテムの整数インデックスを返します。あなたは、単純に次の(または前)のアイテムを取得するために1を加算(または減算)ことができます:それはすべての単一のエントリをチェックする必要があるため

public String function getNext(String uid) { 
    var index = myList.indexOf(uid); 
    if (index > -1) { 
    try { 
     return myList.get(i+1); 
    } catch (IndexOutOfBoundsException e) { 
     // Ignore 
    } 
    } 
    return ""; // consider returning `null`. It's usually a better choice. 
} 

しかしArrayListindexOfを持つオブジェクトを検索することは、非常にゆっくりとしたプロセスです。これにはよりよい方法がありますが、それは実際に達成しようとしていることに依存します。

関連する問題