有没有一种方法可以使用循环拆分字符串,而不使用除charAt(0)以外的任何函数?

时间:2019-02-10 01:02:04

标签: java string loops char

我找不到先前发布的与此问题匹配的任何内容。我的任务是分割字符串,然后不使用您通常使用的任何函数就返回分割。我可以用我知道其长度的单词来做到这一点,但是我试图找到一种方法来概括它,如果可能的话。

尽管指定了我们不允许执行的操作,但没有什么好说的:String类中的其他任何方法,除了length(),charAt(),equals(),equalsIgnoreCase(),toLowerCase(),和toUpperCase()。特别是,不允许您使用substring(),split(),contains(),indexOf()或lastIndexOf()。

我认为我应该使用循环和if语句来查找单词(在本例中为电子邮件地址)应拆分的位置(以@符号分隔),提取各个字符,然后将它们连接为字符串。我想知道的是,是否有一种方法可以将其概括化,以便我可以提取charAt(in)而不是i-1,i-2,i-3等。我感觉自己走在正确的轨道上但是我有点卡住。

public static String getDomain (String s){
    String domain = "domain";
    int wordLength = s.length();   
    int i = 0;
    for (i=0; i<= wordLength-1; i++) {
      if (s.charAt(i) == '@') {                    
        domain = (""+s.charAt(i-3)+s.charAt(i-2)+s.charAt(i-1));
              System.out.println(domain);
              return domain;
              }
    }
    return domain;

这将返回在“ @”之前的任何三个字母的单词作为字符串,但是有没有办法使它更通用?我应该使用更多循环吗?有东西嵌套吗?

4 个答案:

答案 0 :(得分:1)

这可能是一种解决方案:

public static String getDomain (String s){
    String domain = ""; // Consider using StringBuilder
    int index = 0;
    while(index < s.length()){
        if(s.charAt(index) == '@'){
            break;
        }
        index++;
    }

    for (int i = 0; i < index; i++){
        domain += "" + s.charAt(i);
    }

    return domain;
}

索引将递增,直到到达@ -Symbol。然后,我们将连接每个字符直到索引。

另一种方式(只有一个循环):

public static String getDomain (String s){
    String domain = ""; // Consider using StringBuilder
    int index = 0;
    while(index < s.length()){
        if(s.charAt(index) != '@'){
            domain += "" + s.charAt(index);
        }else{
            return domain;
        }
        index++;
    }

    return ""; // Return an empty String if there is no @
}

答案 1 :(得分:1)

使用ArrayList拆分:

您可以使用ArrayList来存储结果。数组列表本质上就像一个数组,但是它是动态的,因此您可以从中添加/删除项目,而无需声明其大小。

下面,我对您的功能做了一些修改。不必总是通过@进行拆分,您可以传入自己的定界符(用于拆分字符串的内容)以及要拆分的字符串。

阅读下面的代码注释,以更好地了解其工作原理:

public static ArrayList<String> mySplit(String toSplit, char del) {
    ArrayList<String> result = new ArrayList<String>(); // create an empty array list to store/hold the result

    String currentWord = ""; // create a string which will hold the current word we are looking to add to the array
    for(int i = 0; i < toSplit.length(); i++) { // loop through every letter in the toSplit word
        char currentChar = toSplit.charAt(i); // get the current character

        if(currentChar != del) { // if the current character doesn't equal the "splitting character" then add it to our currentWord variable
            currentWord += currentChar; // add the current character to the end of our currentWord string
        } else { // the current char is the "splitting character"
            result.add(currentWord); // add the current word to the results array
            currentWord = ""; // set the current word back to empty (so the next word can use it)
        }
    }
    result.add(currentWord);
    return result;
}

然后在您的main中,您可以使用如下功能:

public static void main(String[ ] args) {
    ArrayList<String> splitDomain = mySplit("example@domain.com", '@');
    // Print the result from the function
    System.out.println(splitDomain.get(0)); 
    System.out.println(splitDomain.get(1));   
}

这将导致:

example
domain.com

注意:要使用ArrayList,您需要先将其导入:

import java.util.ArrayList

不使用ArrayList进行拆分:

如果无法使用ArrayList,则需要计算最终返回的数组大小。

为此,您可以使用如下函数:

public static int countCharacter(String toCount, char character) {
    int count = 0;
    for(int i = 0; i < toCount.length(); i++) {
        if(toCount.charAt(i) == character) count++;
    }
    return count;
}

以上内容将计算给定字符串中有多少个特定字符。这可以用来告诉您输出数组应该有多大。 (即,如果有一个@,则输出应为长度至少为2的数组)。

将上述函数与数组一起使用,您可以修改mySplit函数使其不使用ArrayLists:

public static String[] mySplit(String toSplit, char del) {
    String[] result = new String[countCharacter(toSplit, del)+1]; // create an empty array with the amount of empty slots required to fit each splitted word.

    String currentWord = "";
    int indexToAdd = 0;
    for(int i = 0; i < toSplit.length(); i++) { // loop through every letter in the toSplit word
        char currentChar = toSplit.charAt(i); // get the current character

        if(currentChar != del) { // if the current character doesn't equal the "splitting character" then add it to our currentWord variable
            currentWord += currentChar; // add the current character to the end of our currentWord string
        } else { // the current char is the "splitting character"
            result[indexToAdd] = currentWord; // add the current word to the results array
            currentWord = ""; // set the current word back to empty (so the next word can use it)
            indexToAdd++; // increment to the next index
        }
    }

    result[indexToAdd] = currentWord;
    return result;
}

然后您可以像这样在main中获得结果数组(拆分数组):

public static void main(String[ ] args) {
    String[] splitDomain = mySplit("example@domain.com@", '@');
    // Print the result from the function
    System.out.println(splitDomain[0]);
    System.out.println(splitDomain[1]);
}

答案 2 :(得分:0)

我都不理解您的问题,但是为什么不使用substring()

public static String getDomain(String email) {
    for (int i = 0, length = email.length(); i < length; i++) {
        if (email.charAt(i) == '@') {
            return email.substring(i + 1);
        }
    }
    return "";
}

如果您不能使用substring(),则仍然可以使用new String(char[], int, int)使用类似的功能:

public static String getDomain(String email) {
    char[] chars = email.toCharArray();
    for (int i = 0, length = chars.length; i < length; i++) {
        if (chars[i] == '@') {
            return new String(chars, i + 1, length - i - 1);
        }
    }
    return "";
}

答案 3 :(得分:0)

/**
 *  Implemention using java without some of methods, eg: indexOf/substring/xxx
 *  allowed: length, toCharArray, StringBuffer
 *  forbid: indexOf、substring
 */
public static ArrayList<String> mySplit(String toSplit, String del) {
  ArrayList<String> result = new ArrayList<String>();
  char[] target = del.toCharArray();
  String currentWord = "";
  for(int i = 0; i < toSplit.length(); i++) {
    int x = i, y = 0;
    String temp = "";
    while (y < target.length && target[y] == toSplit.charAt(x)){
        temp += toSplit.charAt(x);
        x ++;
        y ++;
    }
    if (x == i){
        temp += toSplit.charAt(x);
    }
    if (y < target.length ){
        // 丢失的要找补回来
        currentWord += temp;
    }
    else if(y == target.length){
        i = i + y - 1;
        result.add(currentWord);
        currentWord = "";
    }
    else{
        // 匹配成功
        result.add(currentWord);
        currentWord = "";
    }
  }
  result.add(currentWord);
  return result;
}