Я бы рекомендовал адаптировать String[][]
к CharSequence
. Затем вы можете делать все, что можете, с помощью CharSequence
, и это также означает, что вы можете использовать java.util.regex.Matcher
для поиска строки, и вам не нужно реализовывать собственный алгоритм поиска.
Например:
public class Main {
public static void main(String[] args) {
String[][] array2d = createArray();
int charSeqColumn = 0;
CharSequence charSequnce = new Array2DColumnCharSequnce(array2d, charSeqColumn);
System.out.println(charSequnce.toString());
Pattern patttern = Pattern.compile("ext");
Matcher matcher = patttern.matcher(charSequnce);
while (matcher.find()) {
String matchGroup = matcher.group();
int start = matcher.start();
int end = matcher.end() - 1;
String msg = MessageFormat.format("{0} matched at: [{1}] - [{2}]", matchGroup, start, end);
System.out.println(msg);
}
}
private static String[][] createArray() {
String[][] array2d = new String[2][10];
array2d[0][0] = "N";
array2d[0][1] = "e";
array2d[0][2] = "x";
array2d[0][3] = "t";
array2d[0][4] = " ";
array2d[0][5] = "N";
array2d[0][6] = "e";
array2d[0][7] = "x";
array2d[0][8] = "t";
array2d[0][9] = " ";
array2d[1][0] = "H";
array2d[1][1] = "e";
array2d[1][2] = "l";
array2d[1][3] = "l";
array2d[1][4] = "o";
array2d[1][5] = "W";
array2d[1][6] = "o";
array2d[1][7] = "r";
array2d[1][8] = "l";
array2d[1][9] = "d";
return array2d;
}
}
выведет
Next Next
ext matched at: [1] - [3]
ext matched at: [6] - [8]
Я бы реализации CharSequence
подгонку как этот
class Array2DColumnCharSequnce implements CharSequence {
private int column;
private String[][] array2d;
private int endIndex;
private int startIndex;
public Array2DColumnCharSequnce(String[][] array2d, int column) {
this(array2d, column, 0, array2d[column].length);
this.array2d = array2d;
this.column = column;
}
public Array2DColumnCharSequnce(String[][] array2d, int column,
int startIndex, int endIndex) {
this.array2d = array2d;
this.column = column;
this.startIndex = startIndex;
this.endIndex = endIndex;
}
public int length() {
return endIndex - startIndex;
}
public char charAt(int index) {
String charString = array2d[column][startIndex + index];
return charString.charAt(0);
}
public CharSequence subSequence(int start, int end) {
Array2DColumnCharSequnce array2dColumnCharSequnce = new Array2DColumnCharSequnce(
array2d, column, start, end);
return array2dColumnCharSequnce;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder(this);
return sb.toString();
}
}
Примечание: Array2DColumnCharSequnce
является Jus t быстрая реализация, и она еще не рассматривает обработку исключений, и не учитывает то, что происходит, когда в столбце строки содержится более одного символа.
Почему использовать CharSequence
декоратор
Разницы с адаптацией массива к CharSequence
другим подходам является то, что вы используете стандартный интерфейс Java, который может быть повторно использован со многими другими классами и, таким образом, очень гибкий.
Некоторые часто используемые стандартные классы Java, которые принимают в качестве параметра CharSequence
Полный список here.
Используйте приведенный выше код и попробуйте сделать это, чтобы узнать, насколько гибким является декоратор.
public static void main(String[] args) {
String[][] array2d = createArray();
CharSequence charSequnce = new Array2DColumnCharSequnce(array2d, 0);
boolean contentEquals = "Next Next ".contentEquals(charSequnce);
System.out.println(contentEquals);
CharSequence column1CharSequnce = new Array2DColumnCharSequnce(array2d, 1);
String replaced = "I want to say Next Next ".replace(charSequnce, column1CharSequnce);
System.out.println(replaced);
}
выведет
true
I want to say HelloWorld
Наконец, каждый должен решить, что он/она хочет, и что соответствует ситуации. Я предпочитаю реализации, которые дают мне больше возможностей, если я могу получить их «почти» бесплатно.
Одним из наиболее эффективных результатов поиска является «BinarySearch». «Red Black Tree» или «AVL Tree» могут быть реализованы для более эффективного поиска. – erencan
Существует целая группа [алгоритмы поиска строк] (http://en.wikipedia.org/wiki/String_searching_algorithm). – Domi
Также обратите внимание, что если ваш массив содержит [letter1, data, data, data ..., letter2, data ...], вы получите неверный коэффициент попадания в кеш, который необходим для производительности при работе с большими наборами данных. Попытайтесь повторно расположить свои данные как [letter1, letter2, ... letterN, data, data, ...]. [Вот почему.] (Http://stackoverflow.com/questions/16699247/what-is-cache-friendly-code) (не против, что он говорит о C++, это относится ко всем языкам). – Domi