これは簡単に答えられると思います。たとえば、Java で split() メソッドを使用して 2012, 01, 01 を取得する方法で、20120101 を分割するにはどうすればよいでしょうか。コンマまたはピリオドで区切られていますが、何も区切られていない場合はどうすればよいですか?
3 に答える
たとえば、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 を使用する非常に便利なソリューション:StringReader
StreamTokenizer
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
に応じて標準入力と標準出力をリダイレクトした後、リフレクションを使用して呼び出すことができます。
これを試して:
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);
コメントで言ったように、これに 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));
}
}