2013-03-23 8 views
15

char配列をリストに変換する方法を教えてください。 ユーザが文字列を入力するプログラム(例えば、"Mike is good")を出力しようとしています。出力では、各空白は"%20"(Ie "Mike%20is%20good")に置き換えられています。これは多くの方法で行うことができますが、挿入と削除はリンクリストでO(1)時間かかるので、リンクリストで試してみることを考えました。私はcharの配列をリストに変換し、リストを更新してからそれを元に戻すようなやり方を探しています。文字配列をJavaでリストに変換する

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

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

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

+2

の力だけとしてこの回答を掲載しますリスト、あなたはキャラクターが必要です。しかし、あなたのアプローチはうまくいかないので、たとえば代わりに[Apache Commons]のArrayUtils.toObject(char [])(http://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/ArrayUtils.html)を参照してください。 – s106mo

答えて

15

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

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が配列または可変引数を取ることができます。この場合、char [] charsと見なされます。char[]の1つの可変値!だから、あなたも

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

+0

リスト asList = Arrays.asList(chars); //これはコンパイルするためです。これはコンパイルされません。配列型のメソッドasList(Object [])は引数(char [])には適用されません –

+0

@PhilipJはい、そうです。それは私のEclipseで行います。 **あなたのものではない場合 - バグレポートを提出してください。与えられたコードでは、 'char []'は単一のオブジェクトになります。charの配列ではありません。それは私の答えに書かれています。 – dantuch

1
あなたはプリミティブ型とJavaでジェネリックを使用することはできません

why?

あなたが本当にリストに変換したいと戻って配列に続いdantuchのアプローチがある場合のような何かを書くことができます正しいもの。

しかし、あなただけの交換をしたい場合は、このようにそれを使用することができます

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

のためにそれを行うことができますそこに方法(すなわちjava.lang.StringさんreplaceAll)があります。

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

出力:

Mike%20is%20good 
13

になりループを使用するよりも別の方法GuavaChars.asList()メソッドを使用してください。そして、文字のLinkedListのに文字列を変換するためのコードは、単に次のとおりです。

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

または、より多くのグアバのように:

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

グアバライブラリが良いものがたくさん含まれているので、それは価値がありますそれをあなたのプロジェクトに含めます。 Javaの8で

+1

誰にでもdownvoteをしました...どうすればこの答えを改善できますか? –

+0

@Cyrille Ka私は投票しませんでしたが、あなたが提供した回答はコンパイルされないため(コンパイルできない可能性が高いため)、推測できます。 – mbmast

+0

@mbmast "string"は以前に初期化されたString型の変数であり、Guavaの依存関係はプロジェクトに含まれていれば、どちらの例もJava 5から8でコンパイルされています。ご使用のマシンでエラーが発生した場合は、コンパイラエラーを教えてください。 –

14

CharSequence::chars方法はList<Character>Stringを変換するために1行の方法を提供します:

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

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

2

今、私はすべてのLIBを使用することを許可されていないすべてのそれらの開発者のための別のオプションがありますが、あなたのためのプリミティブデータ型を使用することはできません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); 
関連する問題