如何使用Java中的给定关键字流式处理字符串句子

时间:2019-03-06 09:48:19

标签: java xpath schematron

我一直在尝试使用某些给定的关键字修改给定的句子,以创建要测试的Schematron表达式。

我分享了示例和我尝试过的代码。但是,我无法弄清楚如何将一个列表中的所有值与订单组合在一起。

代码:

    int index = -1;
    int index2 = -1;
    int index3 = -1;
    Map <Integer, String> tempMap;
    Map <Integer, String> tempMap2;
    Map <Integer, String> tempMap3;
    List <List <String>> result = new LinkedList <>();
    List <List <String>> resultForOperators = new LinkedList <>();
    List <List <String>> tempList = new LinkedList <>();
    List <String> sentence = new ArrayList <>();
        sentence.add("meal is ('excellent' or 'wonderful' or 'acceptable') and dog is a 'good' friend or 'best' friend");
        sentence.add("cats are ('excellent') or dog is ('wonderful and excellent')");
        sentence.add("Animals are ('beautiful') and cats are Animals");


        List <String> keyword = new ArrayList <>();
        keyword.add("dog");
        keyword.add("Animals");
        keyword.add("cats");
        keyword.add("friend");
        keyword.add("water");
        keyword.add("meal");
        keyword.add("milk");


        List <String> op = new ArrayList <>();
        op.add("OR");
        op.add("AND");
        op.add("IS");
        op.add("ARE");

        List <String> adj = new ArrayList <>();
        adj.add("'wonderful'");
        adj.add("'excellent'");
        adj.add("'wonderful and excellent'");
        adj.add("'acceptable'");
        adj.add("'amazing'");
        adj.add("'best'");
        adj.add("'beautiful'");
        adj.add("'good'");

        for (String message : sentence) {
            tempMap = new LinkedHashMap <>();
            tempMap2 = new LinkedHashMap <>();
            tempMap3 = new LinkedHashMap <>();

            for (String key : keyword) {
                index = message.indexOf(key);
                while (index >= 0) {
                    tempMap.put(index, key);
                    index = message.indexOf(key, index + key.length());
                }


            }

            for (String ope : op) {
                index2 = message.indexOf(ope.toLowerCase());
                while (index2 >= 0) {
                    tempMap2.put(index2, ope.toLowerCase());
                    index2 = message.indexOf(ope.toLowerCase(), index2 + ope.toLowerCase().length());

                }

            }
            for (String adj1 : adj) {
                index3 = message.indexOf(adj1.toLowerCase());
                while (index3 >= 0) {
                    tempMap3.put(index3, adj1.toLowerCase());
                    index3 = message.indexOf(adj1.toLowerCase(), index3 + adj1.toLowerCase().length());

                }

            }


            result.add(sortValues(tempMap));
            resultForOperators.add(sortValues(tempMap2));
            tempList.add(sortValues(tempMap3));

        }

        displayResults(result);
        displayResults(resultForOperators);
        displayResults(tempList);

    } catch (NullPointerException e) {
        instance.logger.error(e.getMessage());
    } catch (IndexOutOfBoundsException e) {

    }

}

public static List <String> sortValues(Map <Integer, String> tempMap) {
    Map <Integer, String> map = new TreeMap <>(tempMap);
    List <String> sortedValues = new LinkedList <String>(map.values());
    return sortedValues;
}

public void displayResults(List <List <String>> result) {


    for (List <String> list : result) {

        int c = 0;
        for (String value : list) {
            System.out.print(((String) value).replaceAll(" ", "") + " ");
            c++;

        }


        System.out.println();
    }

此代码的输出为:

   meal dog friend friend 
   cats dog 
   Animals cats Animals 
   is or or and is or 
   are or is and 
   are and are 
   'excellent' 'wonderful' 'acceptable' 'good' 'best' 
   'excellent' 'wonderful' 'excellent' 
   'beautiful'

所需的输出是:

meal is 'excellent' or meal is 'wonderful'or meal is 'acceptable') and dog is 'good' friend or dog is 'best' friend
cats are 'excellent' or dog is 'wonderful' or dog is 'excellent'
Animals are 'beautiful' and cats are Animals

我将所有内容分开打印,以便您更好地了解需要做什么。

这里的主要思想是创建Schematron验证,以测试给定句子中的表达式。因此,必须为每个调整值重复这些值。因为它是xPath的语法。

如果还有另一种描述XSLT 2.0语法的方法,例如meal is ('excellent', 'wonderful','acceptable'),那将是完美的,因为对于多次出现,我不需要重复相同的值3次或多次。

正如我之前提到的,表达式将转换为xPath定义。

运算符也可能出现在adj部分中,但是由于它们用''编写,因此不应将它们视为运算符,而应将其视为字符串。

对于我的错误以及很复杂的情况,我深表歉意。但我确实尝试过,但尚未找到解决该问题的好方法。

0 个答案:

没有答案