2013-03-23 22 views
15

Biri bana yardımcı olabilir ve bir char dizisini bir listeye nasıl dönüştürdüğümü söyler ve bunun tersi de geçerlidir. Kullanıcıların bir dize (örneğin, "Mike is good") girdiği ve çıktıda her bir boşluk "%20" (I.e "Mike%20is%20good") ile değiştirildiği bir program yazmaya çalışıyorum. Her ne kadar bu birçok şekilde yapılabilir, ancak ekleme ve silme işleminden sonra O (1) zamanını bağlantılı listeye aldığından, onu bağlantılı bir listeyle denemeyi düşündüm. char dizisini bir listeye dönüştürmek, listeyi güncellemek ve sonra geri dönüştürmek için bir ara veriyorum. Char Array'i Java'daki Listeye Dönüştürme

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

Yani bu programda kullanıcı Önce bir char diziye daha sonra bir dizeye dönüştürmek ve am ben StringBuffer içinde saklamak am dize, giriyor, ama bir listesini almak mümkün değilim s'dan l.

Eğer birisi char dizisini bir listeye dönüştürmek için doğru yolu söylese de çok minnettar olurum.

+2

için ilkel bir veri türü kullanamazsınız senin List, karakterin aranması gerekiyor. Ancak yaklaşımınız işe yaramazsa, ör. Bunun yerine [Apache Commons] 'dan ArrayUtils.toObject (char []) (http://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/ArrayUtils.html). – s106mo

cevap

15

char ilkel türden olduğundan, standart Arrays.asList(char[]) çalışmayacaktır. O kadar geriye ne diziyi sürekli tekrarlanması ve bu dizi verilerle yeni bir liste doldurmaktır ... List<Character> yerine List<char[]> üretecek:

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

Ve bu diziye geri List dönüştürmek nasıl:

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




Komik şey List<char[]> asList = Arrays.asList(chars); ne olduğu ve neden: asList dizi veya vararg alabilir. Bu durumda char [] chars,char[] tek değerli vararg değeri olarak olarak kabul edilir! Bu yüzden de

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

+0

Liste asList = Arrays.asList (chars); // Çünkü bu derler. Hayır bu derleme yok: Dizilerdeki asList (Object []) yöntemi argümanlar için geçerli değildir (char []) –

+0

@PhilipJ evet, öyle. Eclipse'imde. Sizinki ** DEĞİL ** eğer bir hata raporu gönderin. Verilen kodda 'char [] 'tek bir nesne olur, bir dizi char değildir. Ve bu benim cevabımda bile yazıyor. – dantuch

1
Sen ilkel türleri ile java jenerikleri kullanamazsınız

, why?

gerçekten Listeye dönüştürmek istediğiniz ve geri diziye ardından dantuch yaklaşımı ise şöyle yazabiliriz doğru olan.

Ama sadece metodları orada vardır değiştirme yapmak istiyorsanız (yani java.lang.String 'ın replaceAll) Eğer

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

için yapabileceği Böyle kullanabilirsiniz:

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

Çıkış:

Mike%20is%20good 
13

olacaktır bir öze kullanılarak daha başka bir yolu, Guava'un Chars.asList() yöntemini kullanın.

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

ya, daha Guava şekilde: Sonra kod Karakter bir LinkedList için bir Dize dönüştürmek için adildir

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

Guava kütüphanesi iyi bir sürü şey içeriyor, bu yüzden buna değer projenize dahil. Eğer List<Character> için char[] dönüştürmek gerekiyorsa

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

Ve, önce ve sonra ondan bir String oluşturabilirsiniz:

Java 8'de
+1

Kime karşı yapılan oylamada ... bu cevabı nasıl geliştirebilirim? –

+0

@Cyrille Ka Oy kullanmadım, ama sanırım verdiğiniz cevap derlemediğinden (ve derleme için düzeltilemez). – mbmast

+0

@mbmast Anlatabildiğim kadarıyla, hem denedim, hem de "string" in daha önce başlatılmış olan String'in bir değişkeni olması ve Guava bağımlılığının projeye dahil olması koşuluyla, her iki örnek de Java 5 - 8 arasında derleniyor. Lütfen makinenizde başarısız olursa derleyici hatasını söyleyin. –

14

, CharSequence::chars yöntem StringList<Character> dönüşme tek satırlık bir yol sağlar Yukarıdaki çözümü uygulayın. Çok okunabilir ve güzel olmayacak olsa da, oldukça kısa olacak.

2

Şimdi herhangi lib kullanmak için izin ancak java SADECE Güç olmayan tüm geliştiriciler için bir başka seçenek bu yanıt sonrası 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);