indexOf Case Sensitive?

后端 未结 19 1271
日久生厌
日久生厌 2020-11-27 19:39

Is the indexOf(String) method case sensitive? If so, is there a case insensitive version of it?

19条回答
  •  清歌不尽
    2020-11-27 20:00

    Here is my solution which does not allocate any heap memory, therefore it should be significantly faster than most of the other implementations mentioned here.

    public static int indexOfIgnoreCase(final String haystack,
                                        final String needle) {
        if (needle.isEmpty() || haystack.isEmpty()) {
            // Fallback to legacy behavior.
            return haystack.indexOf(needle);
        }
    
        for (int i = 0; i < haystack.length(); ++i) {
            // Early out, if possible.
            if (i + needle.length() > haystack.length()) {
                return -1;
            }
    
            // Attempt to match substring starting at position i of haystack.
            int j = 0;
            int ii = i;
            while (ii < haystack.length() && j < needle.length()) {
                char c = Character.toLowerCase(haystack.charAt(ii));
                char c2 = Character.toLowerCase(needle.charAt(j));
                if (c != c2) {
                    break;
                }
                j++;
                ii++;
            }
            // Walked all the way to the end of the needle, return the start
            // position that this was found.
            if (j == needle.length()) {
                return i;
            }
        }
    
        return -1;
    }
    

    And here are the unit tests that verify correct behavior.

    @Test
    public void testIndexOfIgnoreCase() {
        assertThat(StringUtils.indexOfIgnoreCase("A", "A"), is(0));
        assertThat(StringUtils.indexOfIgnoreCase("a", "A"), is(0));
        assertThat(StringUtils.indexOfIgnoreCase("A", "a"), is(0));
        assertThat(StringUtils.indexOfIgnoreCase("a", "a"), is(0));
    
        assertThat(StringUtils.indexOfIgnoreCase("a", "ba"), is(-1));
        assertThat(StringUtils.indexOfIgnoreCase("ba", "a"), is(1));
    
        assertThat(StringUtils.indexOfIgnoreCase("Royal Blue", " Royal Blue"), is(-1));
        assertThat(StringUtils.indexOfIgnoreCase(" Royal Blue", "Royal Blue"), is(1));
        assertThat(StringUtils.indexOfIgnoreCase("Royal Blue", "royal"), is(0));
        assertThat(StringUtils.indexOfIgnoreCase("Royal Blue", "oyal"), is(1));
        assertThat(StringUtils.indexOfIgnoreCase("Royal Blue", "al"), is(3));
        assertThat(StringUtils.indexOfIgnoreCase("", "royal"), is(-1));
        assertThat(StringUtils.indexOfIgnoreCase("Royal Blue", ""), is(0));
        assertThat(StringUtils.indexOfIgnoreCase("Royal Blue", "BLUE"), is(6));
        assertThat(StringUtils.indexOfIgnoreCase("Royal Blue", "BIGLONGSTRING"), is(-1));
        assertThat(StringUtils.indexOfIgnoreCase("Royal Blue", "Royal Blue LONGSTRING"), is(-1));  
    }
    

提交回复
热议问题