1つの文字列に別の文字列が含まれているかどうかを判断します(javaではindex()という関数は使用できません).

3585 ワード

目次:
一.方法の紹介
二.図示
三.ソースコード
一.方法の紹介
1つの文字列str 1に別の文字列str 2が含まれているかどうかを判断します.
1.str 2の最初の文字とstr 1の文字を一度に順番に比較する、等しい文字が見つかるまでまたはstr 1のlengthを完全に探すことを知る. 
2.等しい文字が見つかった場合、str 2の長さでstr 2とstr 1を順次比較する
二.図式
 
三.ソースJDKのjava.lang.String.indexOf(char[],int,int,char[],int,int,int)ソースコード:
/**
     * Code shared by String and StringBuffer to do searches. The
     * source is the character array being searched, and the target
     * is the string being searched for.
     *
     * @param   source       the characters being searched.
     * @param   sourceOffset offset of the source string.
     * @param   sourceCount  count of the source string.
     * @param   target       the characters being searched for.
     * @param   targetOffset offset of the target string.
     * @param   targetCount  count of the target string.
     * @param   fromIndex    the index to begin searching from.
     */
    static int indexOf(char[] source, int sourceOffset, int sourceCount,
                       char[] target, int targetOffset, int targetCount,
                       int fromIndex) {
	if (fromIndex >= sourceCount) {
            return (targetCount == 0 ? sourceCount : -1);
	}
    	if (fromIndex < 0) {
    	    fromIndex = 0;
    	}
	if (targetCount == 0) {
	    return fromIndex;
	}

        char first  = target[targetOffset];
        int max = sourceOffset + (sourceCount - targetCount);

        for (int i = sourceOffset + fromIndex; i <= max; i++) {
            /* Look for first character. */
            if (source[i] != first) {
                while (++i <= max && source[i] != first);
            }

            /* Found first character, now look at the rest of v2 */
            if (i <= max) {
                int j = i + 1;
                int end = j + targetCount - 1;
                for (int k = targetOffset + 1; j < end && source[j] ==
                         target[k]; j++, k++);

                if (j == end) {
                    /* Found whole string. */
                    return i - sourceOffset;
                }
            }
        }
        return -1;
    }

ある文字列に別の文字列のソースコードが含まれているかどうかを模倣して判断します.
public static String compareDoubleString(String source, String target) {
		//             ,       
		int sourceLength = source.length();
		int targetLength = target.length();

		//           
		char firstTargetChar = target.charAt(0);

		//        
		int max = sourceLength - targetLength;
		//         ,                     
		int sourceOffset = -1;
		while (++sourceOffset < max
				&& source.charAt(sourceOffset) != firstTargetChar) {
		}
		if (sourceOffset <= max) {
			//        
			int newSourceOffset = sourceOffset + 1;
			//        ,    offset   targetLength
			int leaveLength = newSourceOffset + targetLength - 1;
			int targetOffset = 1;
			//      ,          
			for (; newSourceOffset < leaveLength
					&& source.charAt(newSourceOffset) == target
							.charAt(targetOffset); newSourceOffset++, targetOffset++)
				;
			if (newSourceOffset == leaveLength) {
				return "  :source  target   !";
			}
		}
		return "   :source   target   !";
	}

総括:このようなアルゴリズムに直面して、私达の第1の反応は先にサブストリングが同じであることを探し当てる时、やっと含むことを返して、その他の条件はすべて含まないで、それから先にソース文字列の中の第1つとサブ文字列の中の第1つを探して等しくて、もし探し出せないならば直接束を結んで、含まないで、もしあるならば、更に順番に判断を増加して、最後のポインタがサブストリングの長さを移動した場合は、含むことを示します.最後に覚えておいてください.
newSourceOffset
++は1回なのでleaveLengthと等しくなります.