Quelqu'un peut-il m'aider et me dire comment convertir un tableau char
en liste et vice versa. J'essaie d'écrire un programme dans lequel les utilisateurs entrent une chaîne (par exemple "Mike is good"
) et dans la sortie, chaque espace est remplacé par "%20"
(C'est à dire "Mike%20is%20good"
). Bien que cela puisse se faire de plusieurs façons, mais comme l'insertion et la suppression prennent O(1) temps dans la liste chaînée, j'ai pensé à l'essayer avec une liste chaînée. Je cherche un moyen de convertir un char
array dans une liste, mettant à jour la liste, puis la reconvertissant.
public class apples
{
public static void main(String args[])
{
Scanner input = new Scanner(System.in);
StringBuffer sb = new StringBuffer(input.nextLine());
String s = sb.toString();
char[] c = s.toCharArray();
//LinkedList<char> l = new LinkedList<char>(Arrays.asList(c));
/* giving error "Syntax error on token " char",
Dimensions expected after this token"*/
}
}
Ainsi, dans ce programme, l'utilisateur entre la chaîne, que je stocke dans un StringBuffer
, que je convertis d'abord en chaîne, puis en tableau char
, mais je ne suis pas en mesure de obtenir une liste l
de s
.
Je serais très reconnaissant si quelqu'un pouvait indiquer la bonne façon de convertir le tableau char
en liste et vice versa.
Dans Java 8 et supérieur, vous pouvez utiliser la méthode String
chars()
:
myString.chars().mapToObj(c -> (char) c).collect(Collectors.toList());
Et si vous devez convertir char[]
à List<Character>
, vous pouvez d'abord créer un String
, puis appliquer la solution ci-dessus. Bien qu'il ne soit pas très lisible et joli, il sera assez court.
Parce que char est de type primitif, la fonction Arrays.asList(char[])
standard ne fonctionnera pas. Il produira List<char[]>
À la place de List<Character>
... donc ce qui reste est d'itérer sur le tableau et de remplir la nouvelle liste avec les données de ce tableau:
public static void main(String[] args) {
String s = "asdasdasda";
char[] chars = s.toCharArray();
// List<Character> list = Arrays.asList(chars); // this does not compile,
List<char[]> asList = Arrays.asList(chars); // because this DOES compile.
List<Character> listC = new ArrayList<Character>();
for (char c : chars) {
listC.add(c);
}
}
Et voici comment reconvertir List en tableau:
Character[] array = listC.toArray(new Character[listC.size()]);
Ce qui est drôle, c'est pourquoi List<char[]> asList = Arrays.asList(chars);
fait ce qu'il fait: asList
peut prendre un tableau ou vararg. Dans ce cas, char [] chars
Est considéré comme vararg à valeur unique dechar[]
! Vous pouvez donc également écrire quelque chose comme
List<char[]> asList = Arrays.asList(chars, new char[1]);
:)
Une autre façon que d'utiliser une boucle serait d'utiliser la méthode GuavaChars.asList () . Ensuite, le code pour convertir une chaîne en une liste de caractères LinkedList est simplement:
LinkedList<Character> characterList = new LinkedList<Character>(Chars.asList(string.toCharArray()));
ou, d'une manière plus goyave:
LinkedList<Character> characterList = Lists.newLinkedList(Chars.asList(string.toCharArray()));
La bibliothèque Guava contient beaucoup de bonnes choses, donc cela vaut la peine de l'inclure dans votre projet.
Maintenant, je publierai cette réponse comme une autre option pour tous les développeurs qui ne sont pas autorisés à utiliser une bibliothèque mais UNIQUEMENT la puissance de Java 8 :)
char[] myCharArray = { 'H', 'e', 'l', 'l', 'o', '-', 'X', 'o', 'c', 'e' };
Stream<Character> myStreamOfCharacters = IntStream
.range(0, myCharArray.length)
.mapToObj(i -> myCharArray[i]);
List<Character> myListOfCharacters = myStreamOfCharacters.collect(Collectors.toList());
myListOfCharacters.forEach(System.out::println);
Vous ne pouvez pas utiliser de génériques dans Java avec des types primitifs, pourquoi?
Si vous voulez vraiment convertir en List et revenir en tableau, l'approche de Dantuch est la bonne.
Mais si vous voulez simplement faire le remplacement, il existe des méthodes (à savoir Java.lang.String
's replaceAll ) qui peut le faire pour vous
private static String replaceWhitespaces(String string, String replacement) {
return string != null ? string.replaceAll("\\s", replacement) : null;
}
Vous pouvez l'utiliser comme ceci:
StringBuffer s = new StringBuffer("Mike is good");
System.out.println(replaceWhitespaces(s.toString(), "%20"));
Sortie:
Mike%20is%20good
Je suppose que la façon la plus simple de le faire serait d'itérer simplement sur le tableau char et d'ajouter chaque élément à la liste de caractères Array, de la manière suivante:
public ArrayList<Character> wordToList () {
char[] brokenStr = "testing".toCharArray();
ArrayList<Character> result = new ArrayList<Character>();
for (char ch : brokenStr) {
result.add(ch);
}
return result;
}
Toutes les opérations peuvent être effectuées en Java 8 ou supérieur:
Vers le tableau de caractères à partir d'une chaîne donnée
char[] characterArray = myString.toCharArray();
Pour obtenir la liste des caractères à partir d'une chaîne donnée
ArrayList<Character> characterList
= (ArrayList<Character>) myString.chars().mapToObj(c -> (char)c).collect(Collectors.toList());
Pour obtenir le jeu de caractères à partir d'une chaîne donnée Remarque: sets ne stocke que la valeur unique. donc si vous voulez obtenir uniquement des caractères uniques d'une chaîne, cela peut être utilisé.
HashSet<Character> abc =
(HashSet<Character>) given.chars().mapToObj(c -> (char)c).collect(Collectors.toSet());
Pour obtenir des caractères dans une plage spécifique à partir d'une chaîne donnée: Pour obtenir le caractère dont la valeur unicode est supérieure à 118. https: // unicode -table.com/en/#basic-latin
Valeur de code ASCII pour les caractères * a-z - 97-122 * A-Z - 65-90
given.chars().filter(a -> a > 118).mapToObj(c -> (char)c).forEach(a -> System.out.println(a));
Il renverra les caractères: w, x, v, z
vous ascii valeurs dans le filtre, vous pouvez jouer avec des personnages. vous pouvez effectuer des opérations sur le personnage dans le filtre, puis vous pouvez les collecter dans la liste ou définir selon vos besoins