2017-08-21 17 views
3

私はオブジェクトのリストを持っており、オブジェクトの特定の属性に特定の文字列が含まれているかどうかに基づいて同じリスト内でそれらを分割したいとします。ブール値に基づいてリストを部分的に並べ替える

List<SomeClassA> someListA = (a list of SomeClassA); 

そして私はattributeAattributeAは、文字列が含まれていないすべてのインスタンスの後に「_DUD」が含まれてSomeClassAのすべてのインスタンスを入れたい:例えば

SomeClassA someClass: 
    String attributeA; 
    ... (other attributes) 

は、私が持っていると言います。

1つのオプション: 私はリストをループし、条件が真であるかどうか( "_DUD"を含む)に基づいて2つのリストを作成して追加し、最初のリストの後に2番目のリストを追加することができますこれらの中間リストを作成せずにそれを行う方法はありますか?

注文は本当に問題ではないので、私は完全な並べ替えをしたくないです。 _DUD属性を含むすべてのインスタンスを一緒にまとめたいだけです。

(これは当然の置き換え名と簡略化した例であるが、私はそれは全体の全体的な必要性を持って願っています)

ありがとう!

+6

'somListA.sort - ;' – shmosel

+1

HTTPSを(Comparator.comparing(X> x.attributeA.endsWith( "_ DUD"))逆に()。): //stackoverflow.com/questions/29723998/boolean-array-reordering-in-o1-space-and-on-time – shmosel

答えて

2

私は、次のアルゴリズムをお勧めしたい:「_DUD」

  • を含む次の要素が「_DUD」を含まない次の要素を見つけ、リストの末尾から行く見つけ、リストの先頭から行く

    • スワップ要素
    • を繰り返します
  • 0

    を満たすまで、あなたはCOMMEで提案されたコンパレータを使用することができますnts;私はまた、いくつかの小さな他のアプローチでプレイしました:

    newList = "A_DUD", "B_DUD", "nope", "nope2", "C_DUD", "D_DUD", "nope3" 
    
    
    for (int i = list.size() - 1; i > 0; --i) { 
    
         if (!newList.get(i).contains("_DUD") && !newList.get(i - 1).contains("_DUD")) { 
          int j = i - 1; 
          do { 
           --j; 
          } while (j >= 0 && !newList.get(j).contains("_DUD")); 
    
          if (j < 0) { 
           break; 
          } 
    
          Collections.swap(newList, j, j + 1); 
          ++i; 
         } 
    
         else if (!newList.get(i).contains("_DUD") && newList.get(i - 1).contains("_DUD")) { 
          Collections.swap(newList, i, i - 1); 
         } 
        } 
    
    関連する問題