Есть ли в Java такой символ подстановки? - PullRequest
7 голосов
/ 10 февраля 2011

Я запускаю программу сравнения, и в этот момент она выполняет прямое сравнение «строка-строка», и, если они точно совпадают, выводится, что они совпадают.

Ну, я надеялся добавить дополнительную функцию, которая учитывала бы «сходство» ...

так, например:

String em1 = "52494646";
String em2 = "52400646";


if (em1.equals(em2)){
    output.writeUTF(dir + filenames[i]);
}

Это своего рода фрагмент кода. Мне бы хотелось, чтобы он пропускал через «00» и все равно распознавал его как «почти» то же число и по-прежнему выводил его.

Я бы подумал, что это будет выглядеть примерно как String em2 = "524"+ ## +"646", но это, очевидно, просто концепция

Кто-нибудь знает, есть ли способ использовать этот «подстановочный знак» (термин, который я выбрал из унив SQL) или есть другой способ заключить сделку с подобным типом.

Спасибо:)

Ответы [ 9 ]

14 голосов
/ 10 февраля 2011

Вы можете использовать регулярные выражения:

if (em1.matches("524[0-9]{2}646")) {
  // do stuff
}
7 голосов
/ 10 февраля 2011

Вы можете легко решить это с помощью регулярных выражений:

if (em1.matches("524..646"))

например.

(. - это подстановочный знак, который обозначает любой символ . Вы можете заменить его на \\d, если хотите ограничить подстановочный знак цифрами.)

Вот более общий вариант, который сопоставляет «0» с любым символом:

String em1 = "52494646";
String em2 = "52400646";

if (em1.matches(em2.replaceAll("0", "\\\\d"))){
    System.out.println("Matches");
}
2 голосов
/ 10 февраля 2011

Я думаю, что проблема с вышеупомянутым решением RE заключается в том, что вас не интересуют идентичные цифры, но для 3-й или 4-й позиции, но идентичные цифры, но для одной / двух цифр.* Это немного более сложная проблема, но вы в основном хотите вычислить http://en.wikipedia.org/wiki/Hamming_distance для ваших двух строк.Хорошо известный алгоритм для множества проблем, поэтому вы должны найти множество примеров, но я боюсь, что стандартная библиотека не сделает этого.Кроме того, это цикл for и счетчик, поэтому у вас не должно возникнуть проблем с реализацией - вы теряете некоторый потенциал оптимизации, который может использовать STL (сравнивая адреса двух строк, и вы должны сравнить всю строку в любом случае)но не намного больше.

1 голос
/ 10 февраля 2011

Регулярные выражения - это способ, которым вы хотите это сделать.Для вашего примера вы бы хотели что-то вроде "524\\d{2}646".См. Java API для Regex .

Также ознакомьтесь с полезной библиотекой ввода-вывода Apache Commons здесь, поскольку похоже, что вы имеете дело с файлами: https://commons.apache.org/proper/commons-io/javadocs/api-release/index.html?org/apache/commons/io/package-summary.html

1 голос
/ 10 февраля 2011

Обычно вы можете сделать комбинацию startWith, заканчиваетсяWith или содержать, чтобы найти, начинается ли строка с, заканчивается ли она или содержит другую строку.Вы можете использовать их в комбинации, как

number.startsWith("524") && number.endsWith("646");

Использование регулярного выражения, вероятно, будет лучшим выбором в 95% случаев, но стоит дороже.

0 голосов
/ 24 июля 2013

Если вы ищете другой способ выразить подстановочный знак, вот вариант:

    String em1 = "52494646";
    String em2 = "52400646";

    if (em2.startsWith("524")){
      output.writeUTF(dir + filenames[i]);
    }
0 голосов
/ 10 февраля 2011

Почему люди не хотят просто писать простой и прямой алгоритм?

boolean equals(String s1, String s2, char wildcard)

    if(s1.length() != s2.length()) 
        return false;

    for(int i=0; i<s1.length(); i++)
        char c1 = s1.charAt(i), c2 = s2.charAt(i);
        if(c1!=wildcard && c2!=wildcard && c1!=c2)
            return false;

    return true;
0 голосов
/ 10 февраля 2011

Ну, к сожалению, я считаю, что Apache Commons StringUtil не имеет операций с подстановочными знаками.

Если я правильно помню, в JDBC-коннекторе mysql есть класс StringUtils, в котором есть метод сравнения строк с подстановочными знаками.

-или -

Вы можете попробовать использовать некоторую нечеткую логику: http://jfuzzylogic.sourceforge.net/html/index.html

0 голосов
/ 10 февраля 2011

Вы должны использовать Регулярные выражения для этого.

...