내가 제대로 이해한다면, 당신은 String
의 두 목록이 있습니다
getLine
입력
addRule
의 라인을 나타내는 문자열 목록은 규칙 세트를 나타내는 문자열의 목록입니다.
각 규칙에는 입력 행과 일치해야하는 여러 부분과 일치하는 경우 사용해야하는 결과가 포함되어 있습니다.
(이 용어는 Java의 컨텍스트에서 매우 특정한 의미를 갖지만이 결과를 "클래스 경로"라고합니다.)
그래서 라인 :
0 Overcast 3 Weak
: 그것은 문자열 "0 흐림"를 포함하고 있기 때문에
0 Overcast 1 High 2 Normal 3 Weak
가 아니라 규칙에 대한 규칙
0 Overcast
에 대해 일치합니다 행에는 ent인데도 "0 Overcast"및 "3 Weak"하위 문자열이 포함되어 있기 때문에 ire 규칙이 줄의 하위 문자열로 나타나지 않습니다.
내가 뭘 찾고 있었는지 하위 집합 검색이고 어쩌면 this answer을 보았지만 사용하려고 시도했지만 문자열 사이의 부분 집합 일치는 복잡하고 정규 표현식을 사용할 수 있지만 그보다 조금 까다 롭습니다. 당신이 시도 했으므로 더 간단한 해결책을 찾으려고하는 것이 좋습니다.
특히 .matches("(.*)"+ruleSet+"(.*)")
을 수행하면 원하는 작업을 수행 할 수 없습니다.
문제에 대한 나의 해석이 정확하다면 의견에 대해 알려주십시오. 해결책을 찾도록 도와 드리겠습니다.
당신이 규칙 세트의 제어를 가정, 그래서
을 계속, 나는 아마 이런 식으로 뭔가를 보이는 규칙 클래스를 만들 것입니다 :
match
이 구현되는 방법
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;
}
}
주의 사항 : (있는 경우) 파트 중 일치하지 않으면 일치가 실패합니다.
(나는 생성자에 varargs을 사용했지만 원하는 경우 목록을 전달할 수 있음).
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"));
...
그리고 때 규칙에 대한 루프, 일치가있는 경우 일치, 또는 결과 존재하지 않는 경우는 null
를 얻을 수 match
전화 :
그럼 당신은 다음과 같은 규칙 세트를 초기화 할 수 있습니다.
String rule = ".*0 Rainy.*3 Strong.*";
if(line.matches(rule)) {
...
을하지만 당신은 그들에 대해 배울 수있는 시간을 가지고 때까지 당신은 아마 정규 표현식을 피해야한다 :
for(Rule rule : ruleSet) {
for(String line : getLine) {
String result = rule.match(line);
if (result != null) {
...
또는이 같은 정규 표현식과 같은 규칙을 작성할 수 있습니다. 그것들은 강력한 도구이지만 많은주의 사항이 있습니다.
텍스트 파일에 설정된 규칙을 유지해야하는 경우
는, 당신은 아마도 다른 생성자와 같은 규칙 객체로 라인을 변환하는 방법을 작성해야 할 것입니다. 한 가지 방법이 있습니다.
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;
}
}
}
downvoters pls 의견 –
더 나은 방법으로 달성하려는 것을 설명해야합니다. 지금은 분명하지 않습니다. – itsadok
규칙 세트를 제어 할 수 있습니까? 다른 방법으로 작성하거나 입력으로 가져올 수 있습니까? – itsadok