35

誰でも私を助けて、char配列をリストに、またはその逆に変換する方法を教えてもらえますか? ユーザーが文字列 (例: ) を入力し、出力で各空白が(Ie )"Mike is good"に置き換えられるプログラムを作成しようとしています。これはさまざまな方法で実行できますが、連結リストでは挿入と削除に O(1) の時間がかかるため、連結リストで試してみることを考えました。配列をリストに変換し、リストを更新してから元に戻す方法を探しています。"%20""Mike%20is%20good"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リストを取得できません。ls

char配列をリストに、またはその逆に変換する正しい方法を教えていただければ、非常に感謝しています。

4

8 に答える 8

67

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

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

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

于 2015-12-02T23:45:18.243 に答える
33

char はプリミティブ型であるため、standardArrays.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);
    }
}

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

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




面白いのはList<char[]> asList = Arrays.asList(chars);、それが何をするのかということです: asListarray またはvarargを取ることができます。この場合、 !の単一値の varargchar [] charsと見なされます。したがって、次のように書くこともできます char[]

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

于 2013-03-23T19:07:29.940 に答える
17

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

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

または、よりGuavaの方法で:

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

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

于 2013-10-21T15:03:22.717 に答える
1

プリミティブ型で Java のジェネリックを使用できないのはなぜですか?

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

しかし、単に置換を行いたい場合は、それを実行できるメソッド (つまり、replaceAlljava.lang.String )があります。

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
于 2013-03-23T19:18:09.740 に答える
1

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

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

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 コード値 * az - 97 - 122 * az - 65 - 90

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

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

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

于 2019-08-21T04:23:16.477 に答える