web-dev-qa-db-ja.com

JavaのChar配列をリストに変換

誰でも私を助けてchar配列をリストに変換する方法を教えてくれますか?ユーザーが文字列(例:"Mike is good")を入力し、各空白が"%20"(つまり"Mike%20is%20good")に置き換えられるプログラムを作成しようとしています。これはさまざまな方法で行うことができますが、挿入と削除にはリンクリストでO(1)時間を要するため、リンクリストで試してみようと思いました。charリストに配列し、リストを更新してから元に戻す。

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"*/
    }
}

したがって、このプログラムでは、ユーザーはStringBufferに格納している文字列を入力しています。最初に文字列に変換してからchar配列に変換していますが、lからリストsを取得できません。

char配列をリストに、またその逆に変換する正しい方法を誰かが教えてくれたらとても感謝しています。

24
bourne

Java 8以降では、 Stringのメソッドchars() を使用できます。

myString.chars().mapToObj(c -> (char) c).collect(Collectors.toList());

char[]List<Character>に変換する必要がある場合は、最初にStringを作成してから、上記のソリューションを適用できます。それは非常に読みやすくてきれいではありませんが、かなり短くなります。

38
hotkey

Charはプリミティブ型であるため、標準のArrays.asList(char[])は機能しません。 _List<char[]>_の代わりに_List<Character>_を生成するので、残っているのは配列を反復処理し、その配列からのデータで新しいリストを埋めることです:

_    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);
    }
}
_

そして、これはリストを配列に戻す方法です:

_    Character[] array = listC.toArray(new Character[listC.size()]);
_




面白いのは、List<char[]> asList = Arrays.asList(chars);がそれを行う理由です:asListは配列またはvarargを取ることができます。この場合、_char [] chars_は単一値の可変引数 _char[]_!と見なされます!だから、次のようなものを書くこともできます

List<char[]> asList = Arrays.asList(chars, new char[1]); :)

21
dantuch

ループを使用する以外の方法は、 GuavaChars.asList() メソッドを使用することです。次に、文字列を文字のLinkedListに変換するコードは次のとおりです。

LinkedList<Character> characterList = new LinkedList<Character>(Chars.asList(string.toCharArray()));

または、よりグアバの方法で:

LinkedList<Character> characterList = Lists.newLinkedList(Chars.asList(string.toCharArray()));

Guavaライブラリには多くの優れたものが含まれているため、プロジェクトに含める価値があります。

14
Cyrille Ka

ここで、この回答を、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);

Javaプリミティブ型では why? ではジェネリックを使用できません

本当にリストに変換して配列に戻したい場合は、dantuchのアプローチが正しい方法です。

しかし、単に置換を行いたい場合は、そこにメソッドがあります(つまりJava.lang.String 's replaceAll )それはあなたのためにそれを行うことができます

private static String replaceWhitespaces(String string, String replacement) {
    return string != null ? string.replaceAll("\\s", replacement) : null;
}

次のように使用できます。

StringBuffer s = new StringBuffer("Mike is good");
System.out.println(replaceWhitespaces(s.toString(), "%20"));

出力:

Mike%20is%20good
1
A4L

これを行う最も簡単な方法は、char配列を繰り返し処理し、次のように各要素をCharacterのArrayListに追加することです。

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

すべての操作は、Java 8以上:で実行できます。

指定された文字列から文字配列へ

char[] characterArray =      myString.toCharArray();

指定された文字列から文字リストを取得するには

 ArrayList<Character> characterList 
= (ArrayList<Character>) myString.chars().mapToObj(c -> (char)c).collect(Collectors.toList());

指定された文字列から文字セットを取得するには注:セットは一意の値のみを保存します。したがって、文字列から一意の文字のみを取得する場合は、これを使用できます。

 HashSet<Character> abc = 
(HashSet<Character>) given.chars().mapToObj(c -> (char)c).collect(Collectors.toSet()); 

指定された文字列から特定の範囲の文字を取得するには:Unicode値が118より大きい文字を取得します。 https:// unicode -table.com/en/#basic-latin

文字のASCIIコード値* a-z-97-122 * A-Z-65-90

 given.chars().filter(a -> a > 118).mapToObj(c -> (char)c).forEach(a -> System.out.println(a));

次の文字を返します:w、x、v、z

あなたはキャラクターで遊ぶことができるフィルター内のアスキー値。フィルターでキャラクターを操作し、必要に応じてリストまたはセットでそれらを収集できます

0
Arpan Saini