2010-03-07 6 views
5

üzerinde üfleme, ama doğru yapıyorum olmadığından emin değilim. Bu yüzden metod darbesiyle sınıf WindyString var. bunu kullanarak sonra:Rüzgar ben bu görevi nasıl yapılacağına ilişkin bazı temel fikir var dize

System.out.println(WindyString.blow(
    "Abrakadabra!   The second chance to pass has already BEGUN! ")); 

böyle bir şey elde olmalıdır:

    e    a e   a   a ea y 
    br k d br ! Th s c nd ch nc t p ss h s lr d B G N! 
    A a a a a   e o    o   a    E U 

yüzden her saniye kelimede özetle biz her ünlüleri almak ve yukarıda onlara bir satır taşıyın. Kelimelerin ikinci yarısında ünlüleri bir satır aşağı taşırız.

şimdi ne ben simgeleştiricisine veya bölünmüş yöntemle jeton dize bölmek gerektiğini biliyorum ama? Her bir satırı temsil eden 3 dizi oluşturulsun mu?

cevap

2

basit yolu düzenli ifade kullanmaktır. Bu öğretici olmalıdır:

static String blow(String s) { 
    String vowels = "aeiouAEIOU"; 
    String middle = s.replaceAll("[" + vowels + "]", " "); 
    int flip = 0; 
    String[] side = { "", "" }; 
    Scanner sc = new Scanner(s); 
    for (String word; (word = sc.findInLine("\\s*\\S*")) != null;) { 
     side[flip] += word.replaceAll(".", " "); 
     side[1-flip] += word.replaceAll("[^" + vowels + "]", " "); 
     flip = 1-flip; 
    } 
    return String.format("|%s|%n|%s|%n|%s|", side[0], middle, side[1]); 
} 

Bu doğru aşırı boşlukları işler göstermek için çıkış | karakter eklendi - her üç hat boşlukları, önde gelen boşlukları bakımı arka, aynı uzunluğa garanti, hatta edilir TÜM boş girdiler. Normal ifadeler konusunda bilginiz yoksa

, bu kesinlikle ile öğrenmeye başlamak için iyi bir tanesidir. middle

basitçe boşluk ile değiştirilir tüm ünlülerin orijinal dizedir.

Daha sonra, side[0] ve side[1] sırasıyla üst ve alt çizgilerdir. Her sözcüğü ayıklamak için Scanner'u kullanıyoruz (öndeki ve sondaki boşlukları koruyarak). Her kelimeyi işleme şeklimiz, bir tarafta her şeyin boşluklarla yer değiştirmesidir; diğer yanda, sadece sesli olmayanlar boşluklarla değiştirilir. İşlediğimiz her kelimeyle tarafları çeviririz.

+0

bu regex aracılığıyla bana yol açabilir? – owca

+0

Regex'ler çok zor olabilir, ancak sadece temel öğeleri kullanıyorum. Özellikle öğretici dersleri okuyun: karakter sınıfı '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''. Cesareti yok: regex çok güçlü bir araçtır. – polygenelubricants

5

Evet, muhtemelen sorunu çözmek için kolay (çok ölçülebilir değil) yoludur.

3 diziler oluşturmak; Biri gerçek verilerle doldurulur ve 2 dizi ' ' ile doldurulur (Arrays.fill).

Sonra gerçek verileri içeren dizi sürekli tekrarlanması ve Gittiğiniz hangi kelimeyi bir tamsayı ve zaten boşluk uyum olursa bir boole tutun. karakteri bir sesli harf olup olmadığını

iterating ederken, kontrol edin. Bir sesli harf ise, kelime sayımını (gariplik/eşitlik) kontrol edin ve ilk veya üçüncü diziye yerleştirin. Bir boşluk aralığına ulaştığınızda, boole değerini ayarlayın ve sözcük sayısını artırın. Başka bir boşlukla karşılaşırsanız, boşluk alanının önceden ayarlanmış olup olmadığını kontrol edin: eğer öyleyse, devam edin. Boş olmayan bir alanla eşleşirseniz, boşluk boşluğunu sıfırlayın.

Sonra hep birlikte diziler katılmak ve her katıldı dizisi arasında yeni bir hat karakteri ekler ve dize döndürür.

İlgili konular