2

これは簡単に答えられると思います。たとえば、Java で split() メソッドを使用して 2012, 01, 01 を取得する方法で、20120101 を分割するにはどうすればよいでしょうか。コンマまたはピリオドで区切られていますが、何も区切られていない場合はどうすればよいですか?

4

3 に答える 3

5

たとえば、Java で split() メソッドを使用して 2012, 01, 01... を取得するために、20120101 という数値を分割するにはどうすればよいでしょうか。

あなたはしません。split一般に、明示的な区切り文字を含むテキスト用です (他の回答を見ることはできますが、それは仕事に最適なツールではありません)。次のオプションがあります。

  • String.substring特定の位置で部分文字列を引き出すために使用します。例えば:

    String m = "20120101".substring(4, 6);
    
  • a を使用しSimpleDateFormatて日付を解析します。例えば:

    Date d = new SimpleDateFormat("yyyyMMdd").parse("20120101");
    
  • 数学を使用します (ただし、入力が日付であると想定されているため、意味的には適切ではありません)。例えば:

    int number = Integer.parseInt("20120101");
    int y = number / 10000;
    int m = (number / 100) % 100;
    int d = number % 100;
    


編集:

上記の答えは真面目で善意です。以下の答えは、まったくナンセンスです。

Hovercraft Full Of Eelsでは、正規表現を で使用する方法を示しましたsplit()

やや話題から外れていますが、他のまったく不適切で醜い解決策がいくつかありますが、本当の理由はありません(特に厄介なものを思いつかない限り、正規表現を投稿するつもりはありません):

使用StringReader:

    StringReader reader = new StringReader("20120101");
    String y, m, d;
    char buffer[];

    buffer = new char[4];
    reader.read(buffer);
    y = new String(buffer);        
    buffer = new char[2];
    reader.read(buffer);
    m = new String(buffer);
    reader.read(buffer);
    d = new String(buffer);

または、スペースを挿入するために変更され、トークンを分割するためにa を使用する非常に便利なソリューション:StringReaderStreamTokenizer

    StreamTokenizer st = new StreamTokenizer(new StringReader("20120101") {
        private int position = 0;
        @Override public int read () throws IOException {
            switch (++ position) {
            case 5:
            case 8:
                return ' ';
            default:
                return super.read();
            }
        }
        @Override public int read (char[] cbuf, int off, int len) throws IOException {
            for (int n = off; n < off + len; ++ n)
                cbuf[n] = (char)read();
            return len;
        }
        @Override public boolean markSupported () {
            return false;
        }
        @Override public void reset () throws IOException {
            position = 0;
            super.reset();
        }
    });

    st.resetSyntax();
    st.wordChars('0', '9');
    st.whitespaceChars(' ', ' ');
    st.nextToken();
    String y = st.sval;
    st.nextToken();
    String m = st.sval;
    st.nextToken();
    String d = st.sval;

標準入力から読み取り、適切な場所にコンマを挿入し、結果を出力するプログラムを作成することもできると思います。次に、文字列をそのプログラムにパイプし、(を使用してProcess)出力を読み取ることができますsplit()Process簡単すぎる場合は、クラスローダーを使用してそのプログラムのクラスを動的にロードし、それmainに応じて標準入力と標準出力をリダイレクトした後、リフレクションを使用して呼び出すことができます。

于 2013-11-04T01:30:24.130 に答える
3

これを試して:

String date = "20120101";

String year = date.substring(0, 4);
String month = date.substring(4, 6);
String day = date.substring(6, 8);

または使用SimpleDateFormatしてCalendar:

String date = "20120101";
DateFormat df = new SimpleDateFormat("yyyyMMdd");
Calendar cal = Calendar.getInstance();
try {
    cal.setTime(df.parse(date));
} catch (ParseException e) {
    e.printStackTrace();
    // Could not parse date.
    // Break execution.
}
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
于 2013-11-04T01:28:52.257 に答える
2

コメントで言ったように、これに split(...) を使用しようとすることは、バナナをハンマーとして使用しようとするようなものです。確かに、ある意味では、最終的にはある種の仕事につながるかもしれませんが、それは苦痛であり、結果はあまり信頼できません. 仕事に適したツールを使用してください。

したがって、ここに醜い as h3ll の例があり、にやにや笑いのsplit(...)ために投稿されています。

import java.util.Arrays;

public class DumbSplit {
   public static void main(String[] args) {
      String dateStr = "20120101";

      String bananaAsHammer = "(?<=.{4}).*(?=.{4})|(?<=.{6}).*(?=.{2})";
      String[] tokens = dateStr.split(bananaAsHammer);

      System.out.println(Arrays.toString(tokens));
   }
}
于 2013-11-04T01:52:33.153 に答える