2014-06-18 2 views
1

나는 arraylist에 저장된 입력 데이터를 가지고있다. 목록을 출력을 반복하는 것은 아니 다른 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 ] 

및 규칙

규칙 ----------- [0 흐림 예, 0 비오는 3 강한 반면, 0 비오는 3 약한 예, ​​0 맑음이 높은 없음, 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 Overcast 1 High 2 Normal 3 Weak Yeslike this0 Overcast Yes와 일치하지 않는이다. 그것이 하위 집합 임에도 불구하고 발생합니다.

나는 잘못하고 있습니다.

+0

downvoters pls 의견 –

+1

더 나은 방법으로 달성하려는 것을 설명해야합니다. 지금은 분명하지 않습니다. – itsadok

+0

규칙 세트를 제어 할 수 있습니까? 다른 방법으로 작성하거나 입력으로 가져올 수 있습니까? – itsadok

답변

2

내가 제대로 이해한다면, 당신은 String의 두 목록이 있습니다

  1. getLine 입력
  2. 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; 
      } 
     } 
    } 
+0

을 제어 할 수 있지만 lineSet.matches ("(. *)"+ ruleSet + "(. *)")는 부분 문자열에도 올바르게 일치합니까? 그리고 내가 말했듯이 그것도 [0을 흐리게 1 높음 2 정상 3 약함] *** [0 구름 사이에 일치하기 때문에 일하지 않을 것이라고 말했듯이 노력했다] 서브 문자열을 일치 시키려고 노력 중 –

+0

또는 그걸 통해 규칙 집합과 반복? –

+0

@SreeVeni 규칙 세트가 있다면, 무엇을 상관없이 규칙을 반복해야 할 것입니다. 나는 너의 첫번째 코멘트를 이해하지 못한다. – itsadok