SORU
13 AĞUSTOS 2015, PERŞEMBE


Neden hasNext() Yanlış, ama hasNextLine() Doğru mu?

Soru

Nasıl bir tarayıcı için hasNext() yöntemi false değerini döndürür hasNextLine() yöntem döndürür true nesne değil mi?

Not: giriş dosyası Dayalı hasNext() yöntem beklendiği gibi sonuç veriyor; hasNextLine() doğru sonuç dönüyor gibi görünmüyor.

Kod

İşte aşağıdaki sonuçlar oluşturan bu çalışan kod:

public void ScannerTest(Reader fileReaderObject){
    Scanner scannerObj = new Scanner(fileReaderObject);

    for(int i = 1; scannerObj.hasNext(); i  ){
        System.out.println(i   ": "   scannerObj.next());
        System.out.println("Has next line: "   scannerObj.hasNextLine());
        System.out.println("Has next: "   scannerObj.hasNext());
    }
    System.out.println();

    scannerObj.close();
}

Giriş Dosyası

Aşağıda, bu tarayıcı için geçiyorum bu dosyanın gerçek içeriği

a   3   9
b   3   6
c   3   3
d   2   8
e   2   5
f   2   2
g   1   7
h   1   4
i   1   1

Sonuç

Aşağıdaki kodumu girdim ve bir anlam veremem bölümü içerir: konsol basılmış ne de sonu

25: i
Has next line: true
Has next: true
26: 1
Has next line: true
Has next: true
27: 1
Has next line: true
Has next: false

CEVAP
13 AĞUSTOS 2015, PERŞEMBE


Eğer dosyanın sonunda tek fazladan bir satır var.

  • hasNextLine() tampon linePattern başka bir olup olmadığını görmek için denetler.
  • hasNext() tarayıcının ayırıcı ile ayrılmış gibi bir parseable tampon belirteç olup olmadığını görmek için denetler.

Tarayıcının ayırıcı boşluk ve linePattern da boşluk olduğu için, ama parseable belirteçleri tampon linePattern orada olmak için mümkündür.

Tipik olarak, en yaygın yolu, her zaman tüm simgeleri (örneğin sayılar) metnin her satırı ayrıştırma sonra nextLine() çağırarak bu sorunu ile başa çıkmak için. System.in bir kullanıcının giriş de okurken Scanner kullanırken yapmanız gerekir. Bu boşluk ayırıcı geçmiş tarayıcı ilerlemek için, scanner.nextLine() hat ayırıcı temizlemek için kullanmanız gerekir. Bakın: Using scanner.nextLine()


Ek:

LinePattern uyan Pattern olarak tanımlanır:

private static final String LINE_SEPARATOR_PATTERN =
                                       "\r\n|[\n\r\u2028\u2029\u0085]";
private static final String LINE_PATTERN = ".*(" LINE_SEPARATOR_PATTERN ")|. $";

Varsayılan sınırlayıcı belirteç Pattern bu

private static Pattern WHITESPACE_PATTERN = Pattern.compile(
                                            "\\p{javaWhitespace} ");

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bogdan Gabriel

    Bogdan Gabri

    5 Aralık 2006
  • ExcelIsFun

    ExcelIsFun

    16 ŞUBAT 2008
  • TheFlashCentre

    TheFlashCent

    22 Mayıs 2008