1

我正在练习面试,我被要求在indexOf不使用字符串方法的情况下创建字符串方法。我的第一个想法是将字符串处理成 achar[]但我不知道如何在不使用的情况下这样做.toCharArray()

如果有人曾经问过这个面试问题,我会喜欢你的意见。

4

5 回答 5

3

在不使用将字符串“转换”为字符数组的唯一选项提供的任何方法的情况下,将使用反射:String

char[] c = String.class.getDeclaredField( "value" ).get( "your string" );

请注意,您必须捕获异常等。

还有一个重要说明:这是非常不安全的,因为您永远不知道该字段是否value在任何实现中被调用。这不是String该类的预期用途。另请注意,生成的数组可能比实际字符串大,即空终止字符可能位于任何位置。

于 2014-03-11T16:42:52.407 回答
2

如果您的输入是 a 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
于 2014-03-11T16:43:18.143 回答
1

这很难;老实说,我不知道。

我想知道这些答案有帮助

在Java中遍历字符串字符的最简单/最好/最正确的方法是什么?

有一个答案使用StringCharacterIterator.

于 2014-03-11T16:40:14.167 回答
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;
    }
于 2014-03-11T16:59:57.380 回答
0

您可以定义一个实用方法来访问value实例变量 ofString并返回该字符串中字符的第一个位置(如果存在,则返回-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')));
  }
}
于 2014-03-12T09:05:30.463 回答