在java中匹配子字符串

在java中匹配子字符串,java,string,arraylist,substring,string-matching,Java,String,Arraylist,Substring,String Matching,我有一个存储在arraylist中的输入数据。 在遍历列表时,输出为 Input ----------- [0 Overcast 1 High 2 Normal 3 Weak ] Input ----------- [0 Rainy 1 Mild 2 High 3 Strong ] Input ----------- [0 Rainy 1 Mild 2 Normal 3 Weak ] 并在另一个arraylist中进行规则设置 规则---------[0阴是,0雨3强否,0雨3 弱是,0阳光2

我有一个存储在arraylist中的输入数据。 在遍历列表时,输出为

Input ----------- [0 Overcast 1 High 2 Normal 3 Weak ]
Input ----------- [0 Rainy 1 Mild 2 High 3 Strong ]
Input ----------- [0 Rainy 1 Mild 2 Normal 3 Weak ]
并在另一个arraylist中进行规则设置

规则---------[0阴是,0雨3强否,0雨3 弱是,0阳光2高否,0阳光2正常是]

我期待的输出为

[0 Overcast 1 High 2 Normal 3 Weak Yes]
[0 Rainy 1 Mild 2 High 3 Strong No]
[0 Rainy 1 Mild 2 Normal 3 Weak Yes]
通过查看规则集,我必须在输入中添加标签。 为此,我尝试在输入和规则集之间进行匹配

for(String ruleSet : addRule){ //ruleset
 for(String lineSet : getLine){ //inputline
   if (lineSet.matches("(.*)"+ruleSet+"(.*)")) {
     System.out.println("got----------------"+lineSet+"***"+ruleSet);
     break;
   }
   else{
     System.out.println("Not found----------------"+lineSet+"***"+ruleSet);
   }
 }
}
但我的结果是

0阴1高2正常3弱是
0阴是
不匹配。即使它是一个子集


我做错了什么。

如果我理解正确,您有两个
字符串列表:

  • getLine
    是表示输入行的字符串列表
  • addRule
    是表示规则集的字符串列表
  • 每个规则都包含几个需要与输入行匹配的部分,以及在匹配时应使用的结果

    (您似乎将此结果称为“classpath”,尽管该术语在Java上下文中有非常特殊的含义)

    所以这句话:

    0 Overcast 1 High 2 Normal 3 Weak
    
    会违反规则吗

    0 Overcast
    
    因为它包含子字符串“0阴”,但也违反了规则:

    0 Overcast 3 Weak
    
    因为该行包含子字符串“0阴”和“3弱”,即使整个规则在该行中不显示为子字符串

    我猜您正在寻找的是一个子集搜索,可能看到并尝试使用它,但在字符串之间进行子集匹配是复杂的,使用正则表达式是可能的,但比您尝试的要复杂一些,所以我建议尝试使用一个更简单的解决方案

    具体地说,仅仅执行
    .matches((.*)+ruleSet+“(.*))
    并不能满足您的需要

    如果我对你的问题的解释正确,请在评论中告诉我,我会尽力帮助你找到解决方案

    继续

    因此,假设您控制了规则集,我可能会创建一个如下所示的规则类:

    public class Rule {
        public List<String> parts;
        public String result;
    
        public Rule(String result, String... parts) {
            this.parts = new ArrayList<>();
            for(String part : parts) {
                this.parts.add(part);
            }
            this.result = result;
        }
    
        public String match(String line) {
            for(String part : parts) {
                if (!line.contains(part)) return null;
            }
            return result;
        }
    }
    
    List<Rule> ruleSet = new ArrayList<>();
    ruleSet.add(new Rule("Yes", "0 Overcast"));
    ruleSet.add(new Rule("No", "0 Rainy", "3 Strong"));
    ruleSet.add(new Rule("Yes", "0 Rainy", "3 Weak"));
    ...
    
    String rule = ".*0 Rainy.*3 Strong.*";
    if(line.matches(rule)) {
        ...
    
    当您根据规则循环时,如果不存在匹配项,则调用
    match
    以获取
    null
    ,如果存在匹配项,则调用结果

    for(Rule rule : ruleSet) {
        for(String line : getLine) {
           String result = rule.match(line);
           if (result != null) {
              ...
    

    或者,您可以将规则编写为正则表达式,如下所示:

    public class Rule {
        public List<String> parts;
        public String result;
    
        public Rule(String result, String... parts) {
            this.parts = new ArrayList<>();
            for(String part : parts) {
                this.parts.add(part);
            }
            this.result = result;
        }
    
        public String match(String line) {
            for(String part : parts) {
                if (!line.contains(part)) return null;
            }
            return result;
        }
    }
    
    List<Rule> ruleSet = new ArrayList<>();
    ruleSet.add(new Rule("Yes", "0 Overcast"));
    ruleSet.add(new Rule("No", "0 Rainy", "3 Strong"));
    ruleSet.add(new Rule("Yes", "0 Rainy", "3 Weak"));
    ...
    
    String rule = ".*0 Rainy.*3 Strong.*";
    if(line.matches(rule)) {
        ...
    
    但是,在您有时间了解正则表达式之前,您可能应该避免使用正则表达式。它们是强大的工具,但有许多警告


    如果需要将规则集保存在文本文件中,则必须编写一个方法,将这些行转换为规则对象,可能作为不同的构造函数。这里有一种方法:

    public class Rule {
        ...
        public Rule(String line) {
            this.parts = new ArrayList<>();
            String number = null;
            for (String s : line.split()) {
                if (s.equals("Yes") || s.equals("No")) {
                    this.result = s;
                    return;
                }
                if (number == null) {
                    number = s;
                } else {
                    this.parts.add(number + " " + s);
                    number = null;
                }
            }
        }
    
    公共类规则{
    ...
    公共规则(字符串行){
    this.parts=新的ArrayList();
    字符串编号=空;
    对于(字符串s:line.split()){
    如果(s.equals(“是”)| s.equals(“否”)){
    这个结果=s;
    返回;
    }
    if(number==null){
    数字=s;
    }否则{
    此.parts.add(数字+“”+s);
    数字=空;
    }
    }
    }
    
    down您必须以更好的方式解释您试图实现的目标。目前还不清楚。您是否可以控制规则集?您可以以其他方式编写它们,还是将它们作为输入?我可以控制规则setbut lineSet.matches((.*)+“(.*)”+ruleSet+”(.*))匹配子字符串是否也正确?我尝试了u所说的方法,但同样无效,因为它匹配[0阴1高2正常3弱]***[0阴]我正在尝试匹配子字符串。是否有其他方法存储规则集并通过它进行迭代?@SreeVeni如果你有一个规则集,你可能无论如何都要通过它进行迭代。我不理解你的第一条评论。我想说的是..我试图从规则集中删除类路径并进行匹配,但仍然没有成功它们与inputlineYes不匹配这就是我的意思:)。这是决策树预测的一部分。