我需要编写将其他字符串上的“String str”写入的方法,并返回str开始的索引。
这听起来像是家庭作业,这是一些家庭作业,但我习惯于学习测试......
我试过了:
public int IndexOf (String str) {
for (i= 0;i<_st.length();i++)
{
if (_st.charAt(i) == str.charAt(i)) {
i++;
if (_st.charAt(i) == str.charAt(i)) {
return i;
}
}
}
return -1;
}
但我得不到正确的回报。为什么?我是在正确的方式还是甚至没有关闭?
答案 0 :(得分:3)
我很害怕,你并不亲近。
以下是您必须做的事情:
indexOf
,我会称之为 master )(你这是对的)类似的东西:
Loop master string
for every character (using index i, lets say)
check whether this is same as first character of the other string
if it is
//potential match
loop through the characters in the child string (lets say using index j)
match them with the consecutive characters in the master string
(something like master[j+i] == sub[j])
If everything match, 'i' is what you want
otherwise, continue with the master, hoping you find a match
其他一些观点:
IndexOf
实际应该是
indexOf
_
(如_st
中所述)不是很好
实践。如果你的教授坚持,
你可能没有很多选择,但是
记住这一点)答案 1 :(得分:2)
不是很亲密,我很害怕。该代码基本上做的是检查两个字符串是否在任何点的相同位置有两个字符,如果是,则返回第二个字符的索引。例如,如果_str
是“abcdefg”并且str
是“12cd45”,那么你将返回3,因为它们在同一个地方有“cd”,那就是“d”的索引。至少,这就像我能说出它实际上在做什么一样。那是因为你使用相同的索引变量索引到两个字符串。
要重新撰写indexOf
,在str
内查找_st
,您必须扫描_st
str
中的第一个字符,然后检查是否剩下的字符匹配;如果没有,请从您开始检查的位置前进一个位置并继续扫描。 (你可以做一些优化,但这就是它的本质。)例如,如果你在str
中的索引4处找到_st
的第一个字符而str
是六个字符很久,找到了你需要看到的第一个字符,剩下的五个(str
的索引是否包含1-5个)与_st
的索引是否匹配5-10(最容易检查所有六个) str
的字符串从_st
的子字符串开始,从4开始,然后是6个charactesr)。如果一切都匹配,则返回找到第一个字符的索引(因此,在该示例中为4)。您可以在_st.length() - str.length()
停止扫描,因为如果您在此之前没有找到它,则根本不会找到它。
侧点:不要在每个循环上调用length
函数。 JIT 可以能够优化呼叫,但如果您知道_st
在此功能的过程中不会改变(如果您不知道,那么您应该要求它,抓住length()
到当地,然后参考。当然,既然你知道你可以在length()
之前停止,那么你可以使用当地人来记住你可以停下的地方。
答案 2 :(得分:0)
你正在使用i
两个字符串相等,但是你想要的是第一个始终从0开始的字符串,除非找到该字符是另一个字符串。然后检查下一个字符是否相等,等等。
希望这有帮助
答案 3 :(得分:0)
你的代码循环遍历被搜索的字符串,如果位置i的字符匹配,它会检查下一个位置。如果字符串在下一个位置匹配,则假定字符串str包含在_st中。
您可能想要做的是:
一个问题:
为什么不使用内置的String.IndexOf()函数?这项任务是否意味着您可以自己实现此功能?
答案 4 :(得分:-1)
也许Oracle Java API源代码确实有帮助:
/**
* Returns the index within this string of the first occurrence of the
* specified substring. The integer returned is the smallest value
* <i>k</i> such that:
* <blockquote><pre>
* this.startsWith(str, <i>k</i>)
* </pre></blockquote>
* is <code>true</code>.
*
* @param str any string.
* @return if the string argument occurs as a substring within this
* object, then the index of the first character of the first
* such substring is returned; if it does not occur as a
* substring, <code>-1</code> is returned.
*/
public int indexOf(String str) {
return indexOf(str, 0);
}
/**
* Returns the index within this string of the first occurrence of the
* specified substring, starting at the specified index. The integer
* returned is the smallest value <tt>k</tt> for which:
* <blockquote><pre>
* k >= Math.min(fromIndex, this.length()) && this.startsWith(str, k)
* </pre></blockquote>
* If no such value of <i>k</i> exists, then -1 is returned.
*
* @param str the substring for which to search.
* @param fromIndex the index from which to start the search.
* @return the index within this string of the first occurrence of the
* specified substring, starting at the specified index.
*/
public int indexOf(String str, int fromIndex) {
return indexOf(value, offset, count,
str.value, str.offset, str.count, fromIndex);
}
/**
* 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;
}