Je n'ai trouvé aucun article correspondant à ce problème. Je suis chargé de diviser une chaîne, puis de renvoyer le fractionnement sans utiliser aucune des fonctions que vous utiliseriez normalement pour le faire. Je peux le faire pour les mots dont je connais la longueur, mais j'essaie de trouver un moyen de généraliser, si c'est possible.
Il n'y a pas grand-chose à dire malgré la spécification de ce que nous ne sommes pas autorisés à faire: toute autre méthode de la classe String à côté de length (), charAt (), equals (), equalsIgnoreCase (), toLowerCase () et toUpperCase (). En particulier, vous n'êtes PAS autorisé à utiliser substring (), split (), contains (), indexOf () ou lastIndexOf ().
Je me suis dit que je devrais utiliser une boucle et une instruction if pour trouver où le mot (dans ce cas, une adresse e-mail) devrait se diviser ( par le signe @), extrayez les caractères individuels, puis concaténez-les en une chaîne. Ce que je me demande, c'est s'il y a un moyen de le généraliser pour que je puisse extraire charAt (in), au lieu de at i-1, i-2, i-3, etc. J'ai l'impression d'être sur la bonne voie mais je suis un peu coincé.
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;
Cela renverra tout mot de trois lettres qui précède «@» comme chaîne, mais y a-t-il un moyen de le rendre plus général ? Dois-je utiliser plus de boucles? Quelque chose imbriqué?
4 Réponses :
Cela pourrait être une solution:
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 @ }
L'index sera incrémenté, jusqu'à ce qu'il atteigne le @ -Symbol. Ensuite, nous concaténerons chaque caractère jusqu'à l'index.
Une autre façon (avec une seule boucle):
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; }
pourquoi ne pas faire les deux à la fois?
Le domaine Lol dans un e-mail est après le signe @
, le nom d'utilisateur est avant. :)
Oui vous avez raison. J'essayais juste de garder les noms des variables pour ne pas semer la confusion
Vous pouvez utiliser une ArrayList
qui stockera vos résultats. Une liste de tableaux est essentiellement comme un tableau, cependant, elle est dynamique, vous pouvez donc y ajouter / supprimer des éléments sans avoir à en déclarer une taille.
Ci-dessous, j'ai un peu modifié votre fonction. Au lieu de toujours diviser par @
, vous pouvez passer votre propre délimiteur (l'élément par lequel vous divisez la chaîne) ainsi que la chaîne que vous souhaitez diviser.
Lisez le code commentaires ci-dessous pour mieux comprendre son fonctionnement:
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]); }
Ensuite, dans votre main
, vous pouvez utiliser la fonction comme suit:
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; }
Cela entraînera:
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; }
Remarque: Afin d'utiliser une ArrayList vous devez d'abord l'importer:
import java.util.ArrayList
Si vous ne pouvez pas utiliser ArrayList code > Ensuite, vous devez calculer la taille de votre tableau que vous retournerez éventuellement.
Pour ce faire, vous pouvez utiliser une fonction comme celle-ci:
example domain.com
Étant donné que je n'utilise la méthode que pour un mot, cela fonctionnerait-il d'ignorer complètement les tableaux et d'utiliser uniquement currentWord + = currentChar (semble peu probable)? Je n'ai jamais utilisé de tableaux auparavant et cette affectation sert de forme d'introduction aux chaînes donc je ne sais pas tout à fait ce qui est possible. J'ai essayé de l'essayer mais je suis franchement trop fatigué pour le moment. Merci en tout cas.
@AlexanderElg ouais, c'est possible sans utiliser de tableaux, mais vous devez définir clairement la sortie de votre fonction. Par exemple, si vous entrez "exemple@domaine.com", quelle serait la sortie? Si c'est juste une chaîne comme vous l'avez mentionné, comment aimeriez-vous qu'elle ressemble? Par exemple: comme ceci: "exemple, domaine"
ou ceci: "exemple"
(il suffit de renvoyer l'objet avant le @
) ou simplement de renvoyer le chose après le @
. (c'est-à-dire: "domaine.com"). En fonction de ce que vous souhaitez afficher, la fonction sera plus simple / complexe, il est donc important de définir clairement ce que vous voulez qu'elle renvoie (sortie).
Je l'ai compris. Merci pour le if (currenChar! = Del). C'était ce qu'il fallait
Soit je ne comprends pas votre question, mais pourquoi n'utilisez-vous pas simplement substring()
:
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 ""; }
Si vous ne pouvez pas utiliser substring ()
, vous pouvez toujours utiliser une fonctionnalité similaire en utilisant new String (char [], int, int)
:
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 ""; }
/** * 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; }
Votre objectif final est-il de recréer la fonction
split
? Donc, si j'entre"exemple@domaine.com
, vous obtenez un tableau comme sortie de[" exemple "," domaine.com "] code >?
Essentiellement, oui.
Des considérations d'efficacité ici?
Rien du tout à part c'est bien si ça a l'air plutôt sympa.
Donc, seule la classe String peut être utilisée?