All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.unlaxer.jaddress.parser.HeuristicBlockMatcher Maven / Gradle / Ivy

package org.unlaxer.jaddress.parser;

import org.unlaxer.jaddress.entity.standard.階層要素;

public class HeuristicBlockMatcher{
	
	public enum MatchResult{
		noMatch,
		withSuffix,
		withoutSuffix,
		
		;
		public boolean isMatch() {
			return this == withSuffix || this == withoutSuffix;
		}
	}
	
	public static MatchResult isMatch(ParsingTarget parsingTarget , TripletAddressToken triplet , 階層要素 _階層要素) {
		
		StringAndCharacterKinds stringAndCharacterKinds = triplet.matched().stringAndCharacterKinds().strip();
		CharacterKinds characterKinds = new CharacterKinds(stringAndCharacterKinds);
		
		StringAndCharacterKinds successor = triplet.successor().stringAndCharacterKinds().strip();
		
		String successorString = successor.asString();
		
		if(characterKinds.isNumber() && 
				(successorString.startsWith("号室"))){//||
				//successor.equals("号"))) {
			
			parsingTarget.addResolverResult(
				new ResolverResult(ResolverResultKindOfBoolean.Block要素中に号室を発見));
			return MatchResult.noMatch;
		}
		
		if(triplet.predecessor().stringAndCharacterKinds().size()>1) {
			parsingTarget.addResolverResult(
				new ResolverResult(ResolverResultKindOfBoolean.Block要素の前段のCharacter種類が2個以上));
			return MatchResult.noMatch;
		}
		
		if(triplet.predecessor().stringAndCharacterKinds().joined.length()>2) {
			parsingTarget.addResolverResult(
				new ResolverResult(ResolverResultKindOfBoolean.Block要素の前段の文字列が3文字以上));
			return MatchResult.noMatch;
		}
		
		
		if(successor.isPresent()) {
			
			StringAndCharacterKind term = successor.get(0);
			
			switch (_階層要素) {
			case 町域Top1:
				if(isMatch(term , CharacterKind.suffix丁目)) {
					parsingTarget.addResolverResult(new ResolverResult(ResolverResultKindOfBoolean.丁目要素確定));
					return MatchResult.withSuffix;
				}
				if(isMatch(term, CharacterKind.suffix地番,CharacterKind.suffix号 , 
						CharacterKind.suffix棟 , CharacterKind.suffix階 , CharacterKind.suffix号室 )) {
					return MatchResult.noMatch;
				}
				break;

			case 町域Top2:
				if(isMatch(term , CharacterKind.suffix地番)) {
					parsingTarget.addResolverResult(new ResolverResult(ResolverResultKindOfBoolean.番地要素確定));
					return MatchResult.withSuffix;
				}
				if(isMatch(term, CharacterKind.suffix丁目,CharacterKind.suffix号 , 
						CharacterKind.suffix棟 , CharacterKind.suffix階 , CharacterKind.suffix号室 )) {
					return MatchResult.noMatch;
				}
				break;
			case 町域Top3:
			case 町域Top4:
				if(isMatch(term , CharacterKind.suffix号)) {
					parsingTarget.addResolverResult(new ResolverResult(ResolverResultKindOfBoolean.号要素確定));
					return MatchResult.withSuffix;
				}
				if(isMatch(term, CharacterKind.suffix丁目,CharacterKind.suffix地番 , 
						CharacterKind.suffix棟 , CharacterKind.suffix階 , CharacterKind.suffix号室 )) {
					return MatchResult.noMatch;
				}
				break;
			
			default:
				break;
			}
		}
		return MatchResult.withoutSuffix;
	}
	
	static boolean isMatch(StringAndCharacterKind target , CharacterKind... characterKindOfSuffiixies ) {
		for(CharacterKind  characterKindOfSuffix:  characterKindOfSuffiixies) {
			for(String  suffix : characterKindOfSuffix.strings()) {
				if(suffix.equals(target.string)){
					return true;
				}
			}
		}
		return false;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy