我正在练习面试,我有一个问题是在不使用字符串方法的情况下创建String方法indexOf
。我的第一个想法是将字符串处理成char[]
,但我不知道如何在不使用.toCharArray()
如果有人曾向他们询问这个面试问题,我很乐意接受你的意见。
答案 0 :(得分:3)
不使用String
提供的任何方法,只有"转换"字符数组的字符串将使用反射:
char[] c = String.class.getDeclaredField( "value" ).get( "your string" );
请注意,您必须捕获异常等。
并且大注释:这是非常不安全,因为您永远不知道在任何实现中该字段是否被称为value
。这不是String
类的预期用法。另请注意,生成的数组可能比实际字符串大,即空终止字符可能位于任何位置。
答案 1 :(得分:2)
如果您的输入是CharSequence
,则可以这样执行:
CharSequence str = yourString;
char[] chars = new char[str.length()];
for (int i = chars.length; i-->0;) {
chars[i] = str.charAt(i);
}
//chars now contains the characters of the string
答案 2 :(得分:1)
这很难;说实话,我不知道。
我想知道这些答案有用吗
What is the easiest/best/most correct way to iterate through the characters of a string in Java?
有一个答案使用StringCharacterIterator
。
答案 3 :(得分:1)
public static int customIndexOf(String string,char character) {
String c = String.valueOf(character);
Scanner sc = new Scanner(string).useDelimiter(Pattern.compile(""));
int i=0;
while(sc.hasNext()) {
if (sc.next().equals(c)) {
return i;
}
i++;
}
return -1;
}
答案 4 :(得分:0)
您可以定义一个实用程序方法,该方法可以访问value
String
实例变量,并返回该字符串中字符串的第一个位置(如果存在)或 -1 如果没有:
public class ReflectedUtils {
public static final int indexOf(String s, char c)
{
int position = -1;
try {
Class clazz = Class.forName("java.lang.String");
Constructor constructor = clazz.getDeclaredConstructor(clazz);
String ztring = (String) constructor.newInstance(s);
Field field = ztring.getClass().getDeclaredField("value");
field.setAccessible(true);
char[] chars = (char[]) field.get(ztring);
for (int i=0; i<chars.length; i++)
{
if(chars[i] == c)
{
position = i;
break;
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
finally {
return position;
}
}
public static void main(String... args)
{
System.out.print(String.valueOf(ReflectedUtils.indexOf("Hello", 'e')));
}
}