web-dev-qa-db-fra.com

Conversion d'un tableau de caractères en liste dans Java

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.

24
bourne

Dans Java 8 et supérieur, vous pouvez utiliser la méthode Stringchars() :

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.

38
hotkey

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]); :)

21
dantuch

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.

14
Cyrille Ka

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
1
A4L

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;
}
0
tanmay_garg

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

0
Arpan Saini