2016-03-20 20 views
-2

2 yığınlı bir metin düzenleyici buffer hw atama (left ve right) var. Her şey, çoğunlukla bunun için gereken şekilde çalışır. Ama sahip olduğum sorun, çok fazla beyaz boşluk döndürmesi. Özellikle, metni döndürmek için toString() yöntemini doldurmaya çalışıyorum. örneğin dönüş metin baskılar: harfler arasında tek boşluk ve her kelimenin arasındaki çift boşluklar vardırtoString yöntemi çok fazla whitespaces'i kaldırmak için

T h e r e i s g r a n d e u r i n t h i s v i e w o f l i f e , 

.

There is grandeur in this view of life, 

public class Buffer { 
    private Stack<Character> left; // chars left of cursor 
    private Stack<Character> right; // chars right of cursor 

    // Create an empty buffer. 
    public Buffer() { 
     left = new Stack<Character>(); 
     right = new Stack<Character>(); 
    } 

    // Insert c at the cursor position. 
    public void insert(char c) { 
     left.push(c); 
    } 

    // Delete and return the character at the cursor. 
    public char delete() { 
     if (!right.isEmpty()){ 
      return right.pop(); 
     }else return 0; 
    } 

    // Move the cursor k positions to the left. 
    public void left(int k) { 
     while (!left.isEmpty() && --k >= 0){ 
      right.push(left.pop()); 
     } 
    } 

    // Move the cursor k positions to the right. 
    public void right(int k) { 
     while (!right.isEmpty() && --k >=0){ 
      left.push(right.pop()); 
     } 
    } 

    // Return the number of characters in the buffer. 
    public int size() { 
     return left.size()+right.size(); 
    } 

    // Return a string representation of the buffer with a "|" character (not 
    // part of the buffer) at the cursor position. 
    public String toString() { 

     String a = (left+"|"+right); 


     return a; 
    } 

    // Test client (DO NOT EDIT). 
    public static void main(String[] args) { 
     Buffer buf = new Buffer(); 
     String s = "There is grandeur in this view of life, with its " 
      + "several powers, having been originally breathed into a few " 
      + "forms or into one; and that, whilst this planet has gone " 
      + "cycling on according to the fixed law of gravity, from so " 
      + "simple a beginning endless forms most beautiful and most " 
      + "wonderful have been, and are being, evolved. ~ " 
      + "Charles Darwin, The Origin of Species"; 
     for (int i = 0; i < s.length(); i++) { 
      buf.insert(s.charAt(i)); 
     } 
     buf.left(buf.size()); 
     buf.right(97); 
     s = "by the Creator "; 
     for (int i = 0; i < s.length(); i++) { 
      buf.insert(s.charAt(i)); 
     } 
     buf.right(228); 
     buf.delete(); 
     buf.insert('-'); 
     buf.insert('-'); 
     buf.left(342); 
     StdOut.println(buf); 
    } 
} 
+1

Lütfen bir [Minimal, Tam ve Doğrulanabilir örnek] (http://stackoverflow.com/help/mcve) gönderin. – MikeCAT

+0

Sorunu, bu sitenin kuralları uyarınca sorularınızla çözmek için en iyi niyetinizi göstermelisiniz. Lütfen ayrıca [Ev ödevi sorularını nasıl sorabilirim ve cevaplarım?] Bölümüne bir göz atın (http://meta.stackexchange.com/a/10812/162852). Bu bilgi, soru ev ödevi veya ev işi için (kendi kendine çalışma) olsun ya da olmasın geçerlidir. –

+0

toString() yönteminizin kodu nedir? –

cevap

1

Kodun Stack ait toString() yöntemine dayanır: Sadece kelimeler arasında 1 boşluk benim dize döndürür, böylece kaldırılırken nasıl, harfler arasında boşlukları kaldırırım. Biçimlendirme iyi tanımlanmadıkça ve java.util.Stack için iyi tanımlanmadıkça bunu yapmamalısınız, ancak diğer koleksiyon sınıflarıyla aynı şekilde, yani [value1, value2, value3]. insanlar söylüyorum edilmiş olarak

[]|[s, e, i, c, e, p, S, , f, o, , n, i, g, i, r, O, , e, h, T, , ,, n, i, w, r, a, D, , s, e, l, r, a, h, C, , -, -, , ., d, e, v, l, o, v, e, , ,, g, n, i, e, b, , e, r, a, , d, n, a, , ,, n, e, e, b, , e, v, a, h, , l, u, f, r, e, d, n, o, w, , t, s, o, m, , d, n, a, , l, u, f, i, t, u, a, e, b, , t, s, o, m, , s, m, r, o, f, , s, s, e, l, d, n, e, , g, n, i, n, n, i, g, e, b, , a, , e, l, p, m, i, s, , o, s, , m, o, r, f, , ,, y, t, i, v, a, r, g, , f, o, , w, a, l, , d, e, x, i, f, , e, h, t, , o, t, , g, n, i, d, r, o, c, c, a, , n, o, , g, n, i, l, c, y, c, , e, n, o, g, , s, a, h, , t, e, n, a, l, p, , s, i, h, t, , t, s, l, i, h, w, , ,, t, a, h, t, , d, n, a, , ;, e, n, o, , o, t, n, i, , r, o, , s, m, r, o, f, , w, e, f, , a, , o, t, n, i, , r, o, t, a, e, r, C, , e, h, t, , y, b, , d, e, h, t, a, e, r, b, , y, l, l, a, n, i, g, i, r, o, , n, e, e, b, , g, n, i, v, a, h, , ,, s, r, e, w, o, p, , l, a, r, e, v, e, s, , s, t, i, , h, t, i, w, , ,, e, f, i, l, , f, o, , w, e, i, v, , s, i, h, t, , n, i, , r, u, e, d, n, a, r, g, , s, i, , e, r, e, h, T] 

tüm dizeyi, tersine çevrilir ve braketleri ([]) ve virgül vardır:

(I System.out ile StdOut yerini bir kez) çıktı örneği için this IDEONE görün -space ayırıcılar (,).

Bunu görmüyorsanız, büyük olasılıkla java.util.Stack'u kullanmıyorsunuz, ancak bazı ev geliştirme uygulamaları kullanıyorsunuzdur.

neyse, çözüm çıktı alanlarda etmedi bile "imleç" ortasında bile, yine de kötü sonuçlar elde ediyorum çünkü Stack ait toString() güvenmeyin için toString uygulamayı düzeltin etmektir metniniz.

Eğer java.util.Stack kullanıyorsanız, o zaman, bir StringBuilder() oluşturmak left yineleme ve her bir karakteri ekler, | ekleyin, sonra rightright.listIterator(right.size()) kullanarak ve karakterleri eklemek hasPrevious() ve previous() kullanarak geriye doğru yineleme yineleme gerekir.

+0

doğru, standart java.util.stack kullanarak değil. ama yığının prenston versiyonu (eğer bir fark varsa). http://imgur.com/A2lopuW gibi görünen çıktılar, toString yöntemini doldurmak zorundayım çünkü profesörün bize sorduğu şey buydu. –

+0

* "toString yöntemini doldurmak zorundayım" * Evet, ben de öyle söylüyordum. Çalışmakta olan bir şeye * * * toString() 'yöntemini değiştirmelisiniz, yani" Stack.toString() "yöntemini kullanmamanız demektir, şu anda" left + "ifadesiyle örtük olarak yapıyorsunuzdur. right'. – Andreas

+0

ah, tamam anladım. Bunu nasıl başaracağınızı gösteren bir yön var mı? Yine, bir cevap aramak değil, ama buradan gitmek için hangi yöne doğru. –

0

Ya algoritması (tercih) düzeltmek, ya da burada basit bir "hızlı ve kirli" yolu şudur:

String fixed = str.replaceAll("(?<!) ", ""); 

maç regex "bir boşluk karakteri öncesinde değil uzay karakterler" anlamına gelir.