在java中匹配子字符串
我有一个存储在arraylist中的输入数据。 在遍历列表时,输出为在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
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不匹配这就是我的意思:)。这是决策树预测的一部分。