在java中从字符串创建子字符串而不使用任何字符串函数

时间:2013-12-11 20:46:52

标签: java

我最近在一次采访中被问过这个问题(3次以上经历)。不允许包含String.length的字符串函数。我有5分钟的时间来编写完整的代码。

示例

String ="abcfedbca"
subString = "fed" 

实际上我要求他详细说明一下他说“这很容易实现我应该详细说明的内容”,并且基于这个问题,他说我的核心java非常弱。

7 个答案:

答案 0 :(得分:3)

请注意,您的问题不是很精确,因此您的要求不是很清楚。

简单方法:

String st = new StringBuilder(s).substring(3,6); 

或者您可以使用反射直接构造新的String来获取char数组:

public static String substring(String s, int from, int to){
        Field f = String.class.getDeclaredField("value");
        f.setAccessible(true);
        char [] tab = (char[])f.get(s);
        f.setAccessible(false);
        return new String(tab, from, to - from);
}

<小时/> 这些也可以是选项(请注意,仅当原始String符合十六进制格式时才有效):

String s ="abcfedbca";
BigInteger bi = new BigInteger(s, 16);
bi = bi.and(new BigInteger("16699392")); //0xfed000 in hexa
bi = bi.shiftRight(12);
System.out.println(bi.toString(16));

或者更简单:

String s ="abcfedbca";
System.out.println(Integer.toHexString((int)(Long.parseLong(s, 16) & 16699392) >> 12));

如果你想要一个更通用的方法,这个方法可能适合你的情况:

public static void main(String [] args){
    String s ="abcfedbca";
    System.out.println(substring(s, 2, 5, 9));
}

    public static String substring (String s, int from, int to, int length){
            long shiftLeft = 0;
            long shiftRight = (length - to - 1) * 4;
            for(int i = 0; i < to - from - 1; i++){
                shiftLeft += 15;
                shiftLeft = shiftLeft << 4;
            }
            shiftLeft += 15;
            return Long.toHexString((Long.parseLong(s, 16) & (shiftLeft << shiftRight)) >> shiftRight);
  }

答案 1 :(得分:2)

您可以使用StringBuilder并在其上调用substring。不知道是否允许这样做。

这是另一种方式(尽管我对此解决方案感到羞耻):

String str = "abcfedbca";
int from = 3, length = 3;
java.lang.reflect.Field valueField = String.class.getDeclaredField("value");
valueField.setAccessible(true);
char[] value = (char[]) valueField.get(str);
char[] sub = new char[length];
System.arraycopy(value, from, sub, 0, length);
String substring = new String(sub);

答案 2 :(得分:1)

String buff = "abcfedbca";
System.out.println("substring is = " + buff.substring(3, 6));

怎么样?

答案 3 :(得分:0)

StringBuilder似乎是骗人的,因为它基于字符串。我认为你必须深入到字节原语以满足测试的精神。当然这会调用getBytes,这在技术上是一个String函数,所以也会打破它。

public static void main(String[] args) {
    String full ="abcfedbca";
    String desiredsubString = "fed";

    byte[] fullByte = full.getBytes();  
    byte[] desiredByte = desiredsubString.getBytes();
    byte[] foundStorage = new byte[desiredByte.length];

    boolean foundStart = false;
    int inserted = 0;

    for (byte b : fullByte) {
        if ( !foundStart && (b == desiredByte[0]) )
        {
            foundStorage[0] = b;
            inserted++;
            foundStart = true;
        }
        else if (foundStart && (inserted < foundStorage.length))
        {
            foundStorage[inserted] = b;
            inserted++;

            if ( inserted >= foundStorage.length )
            {
                break;
            }
        }
    }

    System.out.println("These should be equal: " + new String(desiredByte).equals(new String(foundStorage)));

}

答案 4 :(得分:0)

也许:

    String value = "abcfedbca";
    BigInteger bi = new BigInteger(value, 16);
    bi = bi.divide(BigInteger.TEN);
    bi = bi.divide(BigInteger.TEN);
    bi = bi.divide(BigInteger.TEN);
    bi = bi.divide(BigInteger.TEN);
    bi = bi.divide(BigInteger.TEN);
    bi = bi.divide(BigInteger.TEN);
    bi = bi.divide(BigInteger.TEN);     
    int val = bi.subtract(BigInteger.valueOf(535)).intValue();
    String hex = Integer.toHexString(val);  

    System.out.println(hex);

输出:fed

答案 5 :(得分:0)

如何使用JPasswordField来获取字符:

private static String substring(String str, int beginIndex, int endIndex) {
    return new String(new JPasswordField(str).getPassword(), beginIndex, endIndex - beginIndex);
}

String构造函数不是String方法,不是吗?

答案 6 :(得分:0)

public String submethod(String data, int firstindex, int lastindex) {
        char[] chars=data.toCharArray();
        char[]charnew= new char [lastindex];
        for(int i=firstindex; i< lastindex;i++) {
            charnew[i]=chars[i];
        }
        return new String(charnew); 
    }