Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 弹簧&x2B;ibatis&x2B;字符串匹配_String_Spring_Pattern Matching_String Matching_Ibatis - Fatal编程技术网

String 弹簧&x2B;ibatis&x2B;字符串匹配

String 弹簧&x2B;ibatis&x2B;字符串匹配,string,spring,pattern-matching,string-matching,ibatis,String,Spring,Pattern Matching,String Matching,Ibatis,我有一个与ibatis集成的Spring应用程序 我正在调用某个第三方应用程序,从中我得到一条字符串消息(消息是消息的组合,有字符串与\delimiter连接,以连接来自第三方的不同消息)作为输出。 我必须根据字符串匹配过滤这个输出。还有大约150根其他弦。如果输出消息包含150条消息中的任何字符串,我必须添加一些功能 我需要建议来实施它。我想在表中放150个字符串,因为将来计数可能会增加。输出可能不包含这150条消息,或者包含与这150条消息的任意数量的组合 我是春天的新手。请告诉我如何从数据

我有一个与ibatis集成的Spring应用程序

我正在调用某个第三方应用程序,从中我得到一条字符串消息(消息是消息的组合,有字符串与\delimiter连接,以连接来自第三方的不同消息)作为输出。 我必须根据字符串匹配过滤这个输出。还有大约150根其他弦。如果输出消息包含150条消息中的任何字符串,我必须添加一些功能

我需要建议来实施它。我想在表中放150个字符串,因为将来计数可能会增加。输出可能不包含这150条消息,或者包含与这150条消息的任意数量的组合

我是春天的新手。请告诉我如何从数据库获取这些消息,因为我没有获取它们的id,或者我应该将它们全部作为列表获取,然后比较来自第三方的输出字符串。另外,请告诉我将这些消息保存在数据库中是否明智,或者我也可以将它们保存在某些属性文件中,哪一个性能更好


提前感谢。

好的,让我们从一些可能性开始:

如果将来只添加几条消息,并且只在新版本中添加,则将消息存储在枚举中是一个可行的选择:

enum ErrorMessage {

    SOME_MESSAGE("something, bla bla"),
    SOME_OTHER_MESSAGE("something_else"),
    ...;

    private String message;
    private ErrorMessage(String message) {
        this.message = message;
    }

    public static ErrorMessage getByErrorMessage(String message) {
        for(ErrorMessage errorMessage: message) {
            if (errorMessage.message.equals(message)) {
                return errorMessage;
            }
        }
        return null;
    }

    public static boolean exists(String message) {           
        return getByErrorMessage(message) != null;
    }
}
请注意,此版本非常原始,可以通过将所有消息添加到静态集中来改进:

static Set<String> messagesCache = new Hashset<String>();

//in constructor:
messagesCache.add( message );

// better exists() method:
public static boolean exists(String message) {
    return messagesCache.contains(message);
}
在本例中,您可以在每个枚举值中重写doAction方法,前提是该方法除了将消息附加到StringBuilder之外,还应该执行其他操作。在枚举列表中添加一些“NULL_消息”也是一个不错的选择,它不起任何作用,只是为了便于处理:

UNKNOWN_MESSAGE(null) {

    @Override
    public void doAction(StringBuilder finalString) {
        // do nothing here
    }
}

public static ErrorMessage getByErrorMessage(String message) {
    for(ErrorMessage errorMessage: message) {
        if (errorMessage.message != null && errorMessage.message.equals(message)) {
            return errorMessage;
        }
    }
    return UNKNOWN_MESSAGE;
}
通过这种方式,您可以简单地将每一个字符串放入枚举方法doAction(StringBuilder,string)中,并获得结果:如果消息合适,则添加它(并执行一些其他操作),如果不合适,则忽略它,包括空检查

另一方面,如果消息经常更改,则可能不会发布此类更改,而是将值保留在数据库中。在本例中,我将使用消息的hashCode()作为id(正如我所说的,通常是唯一的),并在应用程序启动时将整个内容加载到内存中,例如,允许您再次构建一组hashCode来比较errorMessages的hashCode

protected void init() {
    // load all error Messages from the database
    // put them into a Map<String, String> (hashCode -> Value) or even just a Set<String> (hashcodes)
}
受保护的void init(){
//从数据库加载所有错误消息
//将它们放入一个映射(hashCode->Value)甚至只是一个集合(hashCode)
}

好的,让我们从一些可能性开始:

如果将来只添加几条消息,并且只在新版本中添加,则将消息存储在枚举中是一个可行的选择:

enum ErrorMessage {

    SOME_MESSAGE("something, bla bla"),
    SOME_OTHER_MESSAGE("something_else"),
    ...;

    private String message;
    private ErrorMessage(String message) {
        this.message = message;
    }

    public static ErrorMessage getByErrorMessage(String message) {
        for(ErrorMessage errorMessage: message) {
            if (errorMessage.message.equals(message)) {
                return errorMessage;
            }
        }
        return null;
    }

    public static boolean exists(String message) {           
        return getByErrorMessage(message) != null;
    }
}
请注意,此版本非常原始,可以通过将所有消息添加到静态集中来改进:

static Set<String> messagesCache = new Hashset<String>();

//in constructor:
messagesCache.add( message );

// better exists() method:
public static boolean exists(String message) {
    return messagesCache.contains(message);
}
在本例中,您可以在每个枚举值中重写doAction方法,前提是该方法除了将消息附加到StringBuilder之外,还应该执行其他操作。在枚举列表中添加一些“NULL_消息”也是一个不错的选择,它不起任何作用,只是为了便于处理:

UNKNOWN_MESSAGE(null) {

    @Override
    public void doAction(StringBuilder finalString) {
        // do nothing here
    }
}

public static ErrorMessage getByErrorMessage(String message) {
    for(ErrorMessage errorMessage: message) {
        if (errorMessage.message != null && errorMessage.message.equals(message)) {
            return errorMessage;
        }
    }
    return UNKNOWN_MESSAGE;
}
通过这种方式,您可以简单地将每一个字符串放入枚举方法doAction(StringBuilder,string)中,并获得结果:如果消息合适,则添加它(并执行一些其他操作),如果不合适,则忽略它,包括空检查

另一方面,如果消息经常更改,则可能不会发布此类更改,而是将值保留在数据库中。在本例中,我将使用消息的hashCode()作为id(正如我所说的,通常是唯一的),并在应用程序启动时将整个内容加载到内存中,例如,允许您再次构建一组hashCode来比较errorMessages的hashCode

protected void init() {
    // load all error Messages from the database
    // put them into a Map<String, String> (hashCode -> Value) or even just a Set<String> (hashcodes)
}
受保护的void init(){
//从数据库加载所有错误消息
//将它们放入一个映射(hashCode->Value)甚至只是一个集合(hashCode)
}

Hof是否经常需要添加新消息?它们是否必须在运行时添加,或者只是在新版本的软件中添加?消息的长度(最小/平均/最大)?是否存在可能的差异(例如,大写/小写)或字符串是否始终完全相同?哦,作为一个想法:您确实有一个id,因为字符串的哈希代码可能非常适合于此。此外,另一个问题:您必须执行的操作是否总是相同的,或者对于某些字符串是否有不同的操作?实际上,消息来自第三方系统,这是一个遗留系统。所以我不确定他们总共有多少条信息。当测试进行时,他们希望我添加消息。另外,解决方案应该独立于消息,这样一旦开发结束,即使消息也可以作为配置添加。请告诉我hashcode,我如何使用它。关于第三条评论,操作基本上是,每个输出消息都是警告和错误的组合,我有150条错误消息,我只需要从最后一条消息中删除其他警告消息,只需要保留错误消息。例如,如果我从第三方收到一条消息作为“ABCDEF”,我在数据库中有实际错误的列表,比如说(只有B和EF是错误),那么我需要将整个“ABCDEF”与B和EF进行比较,并返回“B | E | F”以及与B、E和F相关的一些其他细节。Hof通常需要添加新消息吗?它们是否必须在运行时添加,或者只是在新版本的软件中添加?消息的长度(最小/平均/最大)?是否存在可能的差异(例如,大写/小写)或字符串是否始终完全相同?哦,作为一个想法:您确实有一个id,因为字符串的哈希代码可能非常适合于此