我找不到先前发布的与此问题匹配的任何内容。我的任务是分割字符串,然后不使用您通常使用的任何函数就返回分割。我可以用我知道其长度的单词来做到这一点,但是我试图找到一种方法来概括它,如果可能的话。
尽管指定了我们不允许执行的操作,但没有什么好说的: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;
这将返回在“ @”之前的任何三个字母的单词作为字符串,但是有没有办法使它更通用?我应该使用更多循环吗?有东西嵌套吗?
答案 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
来存储结果。数组列表本质上就像一个数组,但是它是动态的,因此您可以从中添加/删除项目,而无需声明其大小。
下面,我对您的功能做了一些修改。不必总是通过@
进行拆分,您可以传入自己的定界符(用于拆分字符串的内容)以及要拆分的字符串。
阅读下面的代码注释,以更好地了解其工作原理:
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
,则需要计算最终返回的数组大小。
为此,您可以使用如下函数:
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;
}