Soru Dize'deki tüm numaraları bul [kapat]


Örneğin, giriş dizesi var: "qwerty1qwerty2";

Çıktı olarak istiyorum [1,2].

Şu anki uygulamam:

import java.util.ArrayList;
import java.util.List;

public class Test1 {

    public static void main(String[] args) {
        String inputString = args[0];
        String digitStr = "";
        List<Integer> digits = new ArrayList<Integer>();

        for (int i = 0; i < inputString.length(); i++) {
            if (Character.isDigit(inputString.charAt(i))) {
                digitStr += inputString.charAt(i);
            } else {
                if (!digitStr.isEmpty()) {
                    digits.add(Integer.parseInt(digitStr));
                    digitStr = "";
                }
            }
        }
        if (!digitStr.isEmpty()) {
            digits.add(Integer.parseInt(digitStr));
            digitStr = "";
        }

        for (Integer i : digits) {
            System.out.println(i);
        }
    }
}

Ama iki kez kontrol ettikten sonra çift puanları dağıtıyorum:

  1. Bazı kod satırları iki kez tekrar eder.

  2. Listeyi kullanıyorum. Bence çok iyi bir fikir değil, diziyi daha iyi kullanıyorum.

Yani ne düşünüyorsun?

Herhangi bir tavsiyede bulunabilir misiniz?


17
2017-11-18 13:20


Menşei


regex kullanamazsınız - Juvanis
Düşüncelerim tam olarak bu düzenli ifadeler kullanarak oldukça önemsiz olurdu ve String#replaceAll(...) - Hovercraft Full Of Eels
Kod incelemeleri için lütfen kod inceleme yığını exchange sitesini kullanın :) - Dave Newton
stackoverflow.com/questions/2367381/... - Andrea Colleoni


Cevaplar:


RepalceAll kullan

String str = "qwerty1qwerty2";      
str = str.replaceAll("[^0-9]+", " ");
System.out.println(Arrays.asList(str.trim().split(" ")));

Çıktı:

[1, 2]

[DÜZENLE]

Eklemek istiyorsanız - eksi, ekle -?:

String str = "qwerty-1qwerty-2 455 f0gfg 4";      
str = str.replaceAll("[^-?0-9]+", " "); 
System.out.println(Arrays.asList(str.trim().split(" ")));

Çıktı:

[-1, -2, 455, 0, 4]

Açıklama

[^-?0-9]+
  • + Bir ve sınırsız zaman arasında, mümkün olduğu kadar çok kez, gerektiğinde geri vermek
  • -? “-?” Karakterlerinden biri
  • 0-9 “0” ve “9” aralığındaki bir karakter

44
2017-11-18 13:34



Teşekkür ederim, Max :) - user471011
Koymalısın str = str.replaceAll("[^-?0-9]+", " "); negatif sayıları eşleştirmek için - Jelle de Fries
@JelledeFries, iyi, kim bilir eğer - olarak temsil edilen eksi veya tire. - Maxim Shoustin
@JelledeFries Cevabımı gerekirse "-" desteği ile düzenledim - Maxim Shoustin
@MaximShoustin Haklısınız, soruna bağlı. Negatif sayıların tanınmasını gerektiren bir problemim vardı. - Jelle de Fries


import java.util.regex.Matcher;
import java.util.regex.Pattern;

...

Pattern pattern = Pattern.compile("[0-9]+"); 
Matcher matcher = pattern.matcher("test1string1337thingie");

// Find all matches
while (matcher.find()) { 
  // Get the matching string  
  String match = matcher.group();
}

Bir regexp çözümü var.


4
2017-11-18 13:27



Aslında, kalıbın burada doğru kullanım olup olmadığını kontrol edeyim, sadece hızlı bir şekilde googled ve doğaçlama yap. Bir süre içinde java ve regexp kullanmayın. - Toni
Evet, eşleşiyor. Sadece seçtiğiniz bir kapsayıcıya sonuç ekleyin. - Toni


bu kodu dene

String s = "qwerty1qwerty2";
for(int i=0;i<s.length();i++)
{
   if(Character.isDigit(s.charAt(i)))
   System.out.print(s.charAt(i)+"  ");
}

0
2017-11-18 13:55



Ve bu satır hakkında ne: "123fgfgfgfgfgfgv5kkk60". Beklenen sonuç [123, 5, 60]. - user471011
değiştirilmiş kod int len ​​= s.length (); (int i = 0; i <len; i ++) {if (Character.isDigit (s.charAt (i))) {System.out.print (s.charAt (i)); i ++; while (i <len && Character.isDigit (s.charAt (i))) {System.out.print (s.charAt (i)); i ++; System.out.print (""); }} - scanE
@ user1831612 Cevabınızı düzenleyin; Bir yoruma kod yazmayı denemeyin - bu okunaksız. - Dave Newton