2016-11-01 5 views
1

要素が隣接していなくてもコレクション(リストまたはセット)が別のコレクションのサブセットである場合、Java(8) 3,4,5]が大集合で、[2,3,4]を検索したい場合はtrueを返し、[2,5]もtrueを返します。[4,2]はfalseを返しますが、4と2はコレクションは同じ順序ではありません隣接していないが、Javaで同じ順序であるサブコレクションを見つける

これを行うのに役立つユーティリティはありますか? これを正しく行うコードですか?

おかげ

+0

あなたは '[1,2,3,4,1,2,3,4]'についてどう思いますか?それは '[3,4,2]'を順番に含みます、それは本当ですか? –

答えて

0

この関数は、aがbを含む場合はtrueを返します。

この関数は、コレクションクラスが.toArray()関数を実装していないと、機能しない場合、コレクションを配列に変換します。

public class CollectionUtils { 
    private CollectionUtils() { 
    } 

    /** 
    * @return true if A contains B in order 
    */ 
    public static <T> boolean checkAcontainsB(Collection<T> a, Collection<T> b) { 
     if (a == null || b == null || b.size()>a.size()) { 
      return false; 
     } 
     if (b.isEmpty()) { 
      return true; 
     } 
     final Object[] aElements = a.toArray(); 
     final Object[] bElements = b.toArray(); 

     for (int i = 0; i < aElements.length; i++) { 

      int bIndex = 0; 
      for(int j = i; j< aElements.length; j++) { 
       if(aElements[j] == bElements[bIndex]) { 
        bIndex++; 
        if(bIndex>=bElements.length) { 
         return true; 
        } 
       } 
      } 
     } 
     return false; 
    } 

} 

あなたはそれをテストすることができます。

@Test 
public void test() { 
    Assert.assertFalse(CollectionUtils.contains(Arrays.asList(1,2,3,4), Arrays.asList(2,3,4,5))); 
    Assert.assertTrue(CollectionUtils.contains(Arrays.asList(1,2,3,4), Arrays.asList(2,3,4))); 
    Assert.assertTrue(CollectionUtils.contains(Arrays.asList(1,2,3,4), Arrays.asList(2,4))); 
    Assert.assertTrue(CollectionUtils.contains(Arrays.asList(1,2,3,4,1,2,3,4), Arrays.asList(3,4,2))); 
    Assert.assertFalse(CollectionUtils.contains(Arrays.asList(1,2,3,4), Arrays.asList(2,3,4,5,6))); 
} 
0

は完全にテストされていないが、あなたは

int[] x = {1,2,3,4,5}; 
    int[] y = {2,5}; 
    int yIndex = 0; 

    for(int i: x){ 
     if(y[yIndex] == i){ 
      yIndex++; 
      if(yIndex >= y.length){ 
       break; 
      } 
     } 
    } 

    System.out.println(yIndex == y.length ? "Match" : "Not Match"); 
0

あなたが簡単にあなたがするつもり正確んどのようなコレクションによって提供される一つのユーティリティメソッドを使用することができ、このような何かを試すことができます。

Collections.disjoint(c1, c2) 

上記のメソッドは、渡された2つのコレクションに共通の項目がなく、逆の場合にtrueを返します。あなたが望むものとまったく同じです。

+0

これはあなたがする必要があるものではありませんか? –

0

を私はあなたの問題のいずれかの一般的な解決策を知っている、しかし、あなたはあなたの問題のためにカスタムメイドのソリューションを見つけることができるの下にはありません。

public static boolean containsArray(int[] a, int[] s) { 
    if (a == null || s == null) return false; 
    if (a.length < s.length) return false; 

    int i = -1; 
    for (int current : s) { 
     do { 
      i++; 
      if (i == a.length) { 
       return false; 
      } 
     } while (a[i] != current); 
    } 

    return true; 
} 
関連する問題