2011-02-04 2 views
1

Есть ли простой способ проверить, содержит ли один массив другой массив в Java?Проверьте, содержит ли примитивный массив другой массив

По существу, я хочу сделать что-то вроде этого:

private static final String NOT_ALLOWED; 

public boolean isPasswordOkay(char[] password){ 
    return new String(password).contains(NOT_ALLOWED); 
} 

... но без преобразования пароля к String, который Sun indicates could be a security risk. Есть ли более аккуратный метод, чем ручное повторение по каждому элементу массива?

+6

Почему преобразование char [] в String представляет собой угрозу безопасности? Строка содержит char [] внутри нее (это реализация) –

+3

@Brian: Строки представляют собой риск безопасности, поскольку они копируют char [] и могут храниться в памяти на неопределенный промежуток времени (потому что они могут быть GCed намного позже): http://securesoftware.blogspot.com/2009/01/java-security-why-not-to-use-string.html –

+0

Строки обрабатываются специально сборщиком мусора и неизменны, поэтому нет способа гарантировать, что они не останется в памяти после того, как вы закончите с ними: http://securesoftware.blogspot.com/2009/01/java-security-why-not-to-use-string.html – Scott

ответ

4

Если вы используете Guava, вы можете определить метод, как это:

public static boolean contains(final char[] array, final char[] target){ 
    return Chars.indexOf(array, target)>=0; 
} 

Ссылка:

Chars.indexOf(char[], char[])


И если вы не хотите использовать Guava , вот объединенная версия моего метода и Guava's:

public static boolean contains(final char[] array, final char[] target){ 
    // check that arrays are not null omitted 
    if (target.length == 0) { 
     return true; 
    } 
    outer: 
    for (int i = 0; i < array.length - target.length + 1; i++) { 
     for (int j = 0; j < target.length; j++) { 
     if (array[i + j] != target[j]) { 
      continue outer; 
     } 
     } 
     return true; 
    } 
    return false; 
} 
0

Существует решение, которое походит на то, что вы хотите на http://www.coderanch.com/t/35439/Programming/Intersection-two-arrays - Пересечение - это математический термин для такого рода вещей!

+2

Пересечение '{'f', 'o', 'o'}' и '{'0', 'f', '1,' 9 ',' c ',' o ',' $ ',' s ',' o '} 'не является пустым, но при использовании прецедента здесь не следует понимать, что второй термин является недопустимым паролем. –

0

Я не могу найти ничего, что бы это сделало. одним из вариантов может быть использование Apache Collections и использование методов subarray ArrayUtils для создания подматриц, а затем сравнение на каждом из создаваемых вами итераций через исходный массив.

-1
new String(password).matches(".*["+NOT_ALLOWED.replace(']','\\').replace("\\","\\\\\")+"].*"); 

Осторожно ... Вы должны избежать некоторых из ваших не разрешенных символов, как ] и \!

+0

-1 - Я прямо сказал, что не хочу конвертировать в строку. – Scott

+0

что это за требование ... почему бы вам просто не использовать some replace() es в своей строке ... omg – Daniel

1
private static final String NOT_ALLOWED="..."; 

public boolean isPasswordOkay(char[] password){ 
    StringBuilder sb = new StringBuilder(password); 
    boolean ret = sb.indexOf(NOT_ALLOWED) != -1; 
    sb.replace(0, sb.length(), " "); 
    return ret; 
} 
Смежные вопросы