18

こんにちは、私は2つの文字列を持っています:

    String hear = "Hi My name is Deepak"
            + "\n"
            + "How are you ?"
            + "\n"
            + "\n"
            + "How is everyone";
    String dear = "Hi My name is Deepak"
            + "\n"
            + "How are you ?"
            + "\n"
            + "Hey there \n"
            + "How is everyone";

「Hey There \n」という文字列にないものを取得したい。メソッドを見つけましたが、この場合は失敗します:

static String strDiffChop(String s1, String s2) {
    if (s1.length() > s2.length()) {
        return s1.substring(s2.length() - 1);
    } else if (s2.length() > s1.length()) {
        return s2.substring(s1.length() - 1);
    } else {
        return "";
    }
}

誰でも助けることができますか?

4

9 に答える 9

28

google-diff-match-patch

Diff Match ライブラリと Patch ライブラリは、プレーン テキストの同期に必要な操作を実行するための堅牢なアルゴリズムを提供します。

違い:

プレーン テキストの 2 つのブロックを比較し、違いのリストを効率的に返します。

マッチ:

検索文字列を指定して、プレーン テキストのブロックで最もあいまいな一致を見つけます。精度と位置の両方に重み付けされています。

パッチ:

プレーン テキストにパッチのリストを適用します。基になるテキストが一致しない場合でも、ベスト エフォートを使用してパッチを適用します。

現在、Java、JavaScript、Dart、C++、C#、Objective C、Lua、Python で利用できます。言語に関係なく、各ライブラリは同じ API と同じ機能を備えています。すべてのバージョンには、包括的なテスト ハーネスも含まれています。

行ごとの差分を行う方法を説明する行または単語の差分wiki ページがあります。

于 2013-08-20T21:13:00.813 に答える
8

Apache CommonsStringUtilsからを使用できます。これがStringUtils APIです。

public static String difference(String str1, String str2) {
    if (str1 == null) {
        return str2;
    }
    if (str2 == null) {
        return str1;
    }
    int at = indexOfDifference(str1, str2);
    if (at == -1) {
        return EMPTY;
    }
 return str2.substring(at);
}
public static int indexOfDifference(String str1, String str2) {
    if (str1 == str2) {
        return -1;
    }
    if (str1 == null || str2 == null) {
        return 0;
    }
    int i;
    for (i = 0; i < str1.length() && i < str2.length(); ++i) {
        if (str1.charAt(i) != str2.charAt(i)) {
            break;
        }
    }
    if (i < str2.length() || i < str1.length()) {
        return i;
    }
    return -1;
}
于 2013-08-20T20:56:39.353 に答える
5

StringTokenizerを使用して解決策を見つけました。以下はコードスニペットです

public static List<String> findNotMatching(String sourceStr, String anotherStr){
    StringTokenizer at = new StringTokenizer(sourceStr, " ");
    StringTokenizer bt = null;
    int i = 0, token_count = 0;
    String token = null;
    boolean flag = false;
    List<String> missingWords = new ArrayList<String>();
    while (at.hasMoreTokens()) {
        token = at.nextToken();
        bt = new StringTokenizer(anotherStr, " ");
        token_count = bt.countTokens();
        while (i < token_count) {
            String s = bt.nextToken();
            if (token.equals(s)) {
                flag = true;
                break;
            } else {
                flag = false;
            }
            i++;
        }
        i = 0;
        if (flag == false)
            missingWords.add(token);
    }
    return missingWords;
}
于 2016-04-27T06:53:46.497 に答える
2

文字列をリストに変換し、次のメソッドを使用して結果を取得します 2 つの配列リストから共通の値を削除する方法

于 2013-08-20T20:58:34.697 に答える
0

Apache Commons の StringUtils を使用する必要があります

String diff = StringUtils.difference( "Word", "World" );
System.out.println( "Difference: " + diff );


Difference: ld

ソース: https://www.oreilly.com/library/view/jakarta-commons-cookbook/059600706X/ch02s15.html

于 2013-08-20T20:57:45.583 に答える
-1

このスニペットはどうですか?

public static void strDiff(String hear, String dear){
    String[] hr = dear.split("\n");
    for (String h : hr) {
        if (!hear.contains(h)) {
            System.err.println(h);
        }
    }
}
于 2013-08-21T07:00:08.113 に答える