0

私は Java を使用しています。次のタスクのためにより良いコードを作成する方法について意見が必要です。

次の文字列値があります

String testStr = "INCLUDES(ABC) EXCLUDES(ABC) EXCLUDES(ABC) INCLUDES(ABC) INCLUDES(ABC)"

文字列を操作し、すべての INCLUDES ステートメントを 1 つの INCLUDES に結合したいと考えています。結果は次のようになります。

INCLUDES(ABC,ABC, ABC) EXCLUDES(ABC, ABC)
4

4 に答える 4

0

このクラスを使用して、最初の文字列を新しい文字列に分割します: http://docs.oracle.com/javase/6/docs/api/java/util/StringTokenizer.html そしてそれらを配列に入れます

新しい文字列を開始し、トークナイザーを使用して括弧内の部分を分割し ( ( と ) を区切り文字として使用するように設定できます)、配列をループして新しい文字列に連結します。

ただし、間違って配置されたスペース (INCLUDES( abc ) など) があると、それが台無しになることに注意してください。

于 2013-02-04T19:24:00.023 に答える
0

次のように小さなユーティリティ結果を書き留めました

if text = "EXCLUDES(ABC) EXCLUDES(ABC) INCLUDES(BMG) INCLUDES(EFG) INCLUDES(IJK)";

output = EXCLUDES(ABC) EXCLUDES(ABC) INCLUDES(BMG & EFG & IJK)

以下は私のJavaコードです。以下をご覧ください。改善できる場合はお気軽にどうぞ。

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.sun.xml.internal.ws.util.StringUtils;

/**
 * Created by IntelliJ IDEA.
 * User: fkhan
 * Date: Aug 31, 2012
 * Time: 1:36:45 PM
 * To change this template use File | Settings | File Templates.
 */


public class TestClass {


    public static void main(String args[]) throws Exception {

        //String text = "INCLUDES(ABC) EXCLUDES(ABC) EXCLUDES(ABC) INCLUDES(EFG) INCLUDES(IJK)";
        String text = "EXCLUDES(ABC) EXCLUDES(ABC) INCLUDES(BMG) INCLUDES(EFG) INCLUDES(IJK)";
        List<String> matchedList = findMatchPhrase("INCLUDES", text);
        String query = combinePhrase(text, "INCLUDES", matchedList);
        System.out.println(query);


    }

    /**
     * This method takes query combine and & multiple phrases
     * @param expression
     * @param keyword
     * @param matchedItemList
     * @return
     */
    private static String combinePhrase(String expression, String keyword, List<String> matchedItemList) {

        //if only one phrase found return value
        if(matchedItemList.isEmpty() || matchedItemList.size() ==1){
            return expression;
        }

        //do not remove first match
        String matchedItem = null;
        for (int index = 1; index < matchedItemList.size(); index++) {

            matchedItem = matchedItemList.get(index);

            //remove match items from string other then first match
            expression = expression.replace(matchedItem, "");
        }

        StringBuffer textBuffer = new StringBuffer(expression);

        //combine other matched strings in first matched item
        StringBuffer combineStrBuf = new StringBuffer();
        if (matchedItemList.size() > 1) {

            for (int index = 1; index < matchedItemList.size(); index++) {
                String str = matchedItemList.get(index);
                combineStrBuf.append((parseValue(keyword, str)));
                combineStrBuf.append(" & ");

            }
            combineStrBuf.delete(combineStrBuf.lastIndexOf(" & "), combineStrBuf.length());
        }

        // Inject created phrase into first phrase
        //append in existing phrase
        return injectInPhrase(keyword, textBuffer, combineStrBuf.toString());
    }

    /**
     *
     * @param keyword
     * @param textBuffer
     * @param injectStr
     */
    private static String injectInPhrase(String keyword, StringBuffer textBuffer, String injectStr) {
        Matcher matcher = getMatcher(textBuffer.toString());
        while (matcher.find()) {

            String subStr = matcher.group();
            if (subStr.startsWith(keyword)) {
                textBuffer.insert(matcher.end()-1, " & ".concat(injectStr));
                break;
            }

        }

       return textBuffer.toString();
    }

    /**
     * @param expression
     * @param keyword
     * @return
     */
    private static String parseValue(String keyword, String expression) {

        String parsStr = "";
        if (expression.indexOf(keyword) > -1) {
            parsStr = expression.replace(keyword, "").replace("(", "").replace(")", "");
        }

        return parsStr;
    }


    /**
     * This method creates matcher object
     * and return for further processing
     * @param expression
     * @return
     */
    private static Matcher getMatcher(String expression){
        String patternString = "(\\w+)\\((.*?)\\)";
        Pattern pattern = Pattern.compile(patternString);
        return pattern.matcher(expression);
    }
    /**
     * This method find find matched items by keyword
     * and return as list
     * @param keyword
     * @param expression
     * @return
     */
    private static List<String> findMatchPhrase(String keyword, String expression) {
        List<String> matchList = new ArrayList<String>(3);

        keyword = StringUtils.capitalize(keyword);
        Matcher matcher = getMatcher(expression);

        while (matcher.find()) {

            String subStr = matcher.group();
            if (subStr.startsWith(keyword)) {
                matchList.add(subStr);
            }
        }

        return matchList;
    }



}
于 2013-02-05T15:04:49.077 に答える
0

この問題のコードを書きましたが、それが良いかどうかわかりません

  • フォーマットに従って、" "を使用してtestStrを分割できます。出力は次のようになります: INCLUDES(ABC)

  • この文字列にINCLUDESまたはEXCLUDESが含まれているかどうかを確認します

  • 次に、 ( )を使用して分割します

このような :

    String testStr = "INCLUDES(ABC) EXCLUDES(C) EXCLUDES(ABC) INCLUDES(AC) INCLUDES(AB)";
    String s[] = testStr.split(" ");
    String INCLUDES = "INCLUDES( ";
    String EXCLUDES = "EXCLUDES ( ";
    for (int i = 0; i < s.length; i++) {
        if (s[i].contains("INCLUDES")) {
            INCLUDES += (s[i].substring(s[i].indexOf("(") + 1, s[i].indexOf(")"))) + "  ";
        }

        else if (s[i].contains("EXCLUDES")) {
            EXCLUDES += (s[i].substring(s[i].indexOf("(") + 1, s[i].indexOf(")"))) + "  ";
        }
    }
    INCLUDES = INCLUDES + ")";
    EXCLUDES = EXCLUDES + ")";
    System.out.println(INCLUDES);
    System.out.println(EXCLUDES);
于 2013-02-04T19:47:44.903 に答える
0

これは合理的なアプローチのようです:

  1. メソッドtestStrを使用して分割します。StringUtils.split" " または null をトークンとして使用します。
  2. を作成しますMap<String, List<String>>。私はそれを次のように参照しますtheMap
  3. 返された配列内の文字列ごとに、次を実行します。

    1. 「()」をトークンとして使用して文字列を分割します。
    2. 返される配列には 2 つの要素が必要です。最初の要素 (インデックス 0) はキーでtheMap、2 番目の要素 (インデックス 1) はリストに追加する値です。

splitting から返された配列の処理が完了したらtestStr、 のキー値を使用しtheMap、関連付けられたリストの要素を文字列に追加して、新しい文字列を作成します。

Apache StringUtils

于 2013-02-04T19:25:41.990 に答える