基于枚举的条件创建数组

时间:2014-08-20 08:13:39

标签: java enums

我有一个标记化的数组

searchTerm = [flu , virus, AND, ebola]

我需要输出

searchTerm = [flu virus, AND, ebola]

枚举条件可以改变

serarchTerm = ['flu', 'virus', OR, 'ebola']

public enum OperatorType
{ 
AND,
OR,
NOT,
IN,
ANY,
KEYWORD,
NONE
}

帮助很多人。

到目前为止我的尝试......

String[] keywords = searchText.split(" ");
String[] keywordCondition = null;

    for(int index = 0; index < keywords.length; index++) {
        for(OperatorType opr : OperatorType.values()) {
            if(keywords[index] == opr.toString()) {
                // Some Logic here
                }                   
            }
        }

4 个答案:

答案 0 :(得分:1)

您有理由使用Enum吗?

因为我的猜测是根据您的问题陈述判断没有。所以(也猜测)searchTextString你分裂然后你不应该split" "一起使用,而是将你的初始String与你想要的分隔符分开:

String[] keywords = searchText.split("AND"); 

你会得到你期望的数组。

另一方面,如果您需要同时使用所有分隔符,请在split内使用带有多个分隔符的正则表达式:

String[] keywords = searchText.split("(AND)|(OR)"); 

答案 1 :(得分:0)

试试这个:

        String beforeEnum = "";
        for(int index = 0; index < keywords.length; index++) {*
            bool isEnum = false;
            for(OperatorType opr : OperatorType.values()) {
                if(keywords[index].equals(opr.toString())) {
                    isEnum = true;
                }                   
            }

            if(isEnum){
                if(!beforeEnum.equals("")){
                    newArray.add(beforeEnum);
                }
                newArray.add(keywords[index]);
            }
            else{
                beforeEnum = beforeEnum + " " + keywords[index];
            }

        }

答案 2 :(得分:0)

您可以使用valueOf()尝试将String值视为Enum成员:

final String[] searchTerms = "flu virus AND ebola".split(" ");
final ArrayList<Object> terms = new ArrayList<Object>();
for (final String term : searchTerms) {
    try {
        terms.add(OperatorType.valueOf(term));
    } catch (IllegalArgumentException e) { // This is not an operator
        if (terms.isEmpty() || !(terms.get(terms.size() - 1) instanceof String)) {
            terms.add(term);
        } else {
            terms.set(terms.size() - 1, terms.get(terms.size() - 1) + " " + term);
        }
    }
}

for (final Object term : terms) {
    System.out.println(term);
}

这将创建一个包含ArrayListStringOperatorType的对象,稍后您可以使用instanceOf识别这些对象。

答案 3 :(得分:0)

以下是使用regex

可以执行的操作
String keyRegex = " (AND|OR|NOT|IN|ANY|KEYWORD|NONE) ";
String[] input = { "flu", "virus", "AND", "ebola" };

String joined = String.join(" ", input); //added in 1.8, use StringBuilder in earlier versions
String replaced = joined.replaceAll(keyRegex, "\n$1\n");
String[] output = replaced.split("\n");

System.out.println(Arrays.toString(output));
// [flu virus, AND, ebola]

然而如果原始数组是通过拆分来自用户的输入创建的,那么这是极端向后并直接使用原始输入而不是创建joined变量。

此外,如果在常规文本之间插入关键字,这将正常工作。您可以手动创建keyRegex,也可以通过枚举名称创建StringBuilder