Java - String split
Ini permasalahannya tentang apa ?
Terkadang kita mengirimkan data inputan ke sebuah sistem dengan cara seperti ini :
- String rat_values = “Food1|Food2|Food3|Food4”
- String animal_foods = “rat:Food1|cat:Food2|dog:Food3|bat:Food4”
- dll
Biasanya dengan tujuan untuk mempersingkat data, dan mempermudah dalam penyimpanan dan konversi data yang berupa tipe data String.
String merupakan tipe data yang umum yang mudah diterima semua sistem dan bisa diencode / decode dan mudah di konversi ke tipe data lainnya.
Lalu ?
Kemudian muncul kebutuhan untuk mengkonversi data diatas tersebut ke dalam sebuah List, atau Map atau tipe data collection lainnya.
Misalnya untuk kasus diatas :
- String rat_values = “Food1|Food2|Food3|Food4” , mau kita jadikan List , menjadi :
- Food1
- Food2
- Food3
- Food4
- String animal_foods = “rat:Food1|cat:Food2|dog:Food3|bat:Food4” , mau kita jadikan Map , menjadi :
- rat:Food1
- cat:Food2
- dog:Food3
- bat:Food4
Dengan mengubahnya menjadi List, atau Map, maka akan lebih mudah bagi kita untuk memproses nya di logic program kita.
Bagaimana untuk mengubahnya menjadi Array atau List ?
Di bahasa Java, kita bisa pakai String.split(regex)
Pendahuluan awal mengenai split bisa dilihat di Java Split
String input = "Food1|Food2|Food3|Food4";
String[] inputArr = input.split("\\|");
Isian regexnya harus pakai "\ \|" , karena tanda pipes (|) merupakan karakter khusus untuk Regular Expression.
Sementara kita ingin karakter pipes (|) ini cuma dianggap karakter biasa saja, sebagai pemisah String.
Kalau kita ingin agar tidak pusing dengan menentukan apakah karakter yang kita masukkan adalah karakter khusus regular expression, maka kita bisa memakai Pattern.quote.
Contoh :
String input = "Food1|Food2|Food3|Food4";
String[] inputArr = input.split(Pattern.quote("|"));
Class Pattern ini merupakan class dalam package Regex nya java yang merupakan class hasil compile dari Regex.
Pattern.quote ini akan menganggap pipes (|) sebagai karakter biasa saja dan tidak dianggap sebagai karakter khusus Regex.
Bagaimana dengan kalau kita ingin menjadikannya List ?
Kalau kita mau menjadikannya sebagai List, maka dapat juga dilakukan sbb :
String input = "Food1|Food2|Food3|Food4";
List<String> inputList = Arrays.asList(input.split("\\|"));
Atau kalau pakai Pattern.quote
String input = "Food1|Food2|Food3|Food4";
List<String> inputList = Arrays.asList(input.split(Pattern.quote("|")));
Atau kalau kita mau menggunakan Stream, maka dapat juga dilakukan sbb :
String input = "Food1|Food2|Food3|Food4";
List<String> inputList = Arrays.asList(input.split("\\|"));
Atau kalau pakai Pattern.quote
String input = "Food1|Food2|Food3|Food4";
List<String> inputList = Arrays.asList(input.split(Pattern.quote("|")));
Contoh Code
Kalau kita coba kumpulkan contoh kode untuk kasus diatas sbb :
import java.util.Arrays;
import java.util.List;
import java.util.regex.Pattern;
import java.util.stream.Stream;
public class SplitList {
public static void main(String[] args) {
String input = "Food1|Food2|Food3|Food4";
// menjadi array
splitArrayRegex(input);
splitArrayRegexQuote(input);
// menjadi list
splitListRegex(input);
splitListRegexQuote(input);
splitListRegexStream(input);
}
private static void splitArrayRegex(String input) {
System.out.print("splitArrayRegex = ");
String[] inputArr = input.split("\\|");
Stream.of(inputArr).forEach(a -> System.out.print(a + ","));
System.out.println();
}
private static void splitArrayRegexQuote(String input) {
System.out.print("splitArrayRegexQuote = ");
String[] inputArr = input.split(Pattern.quote("|"));
Stream.of(inputArr).forEach(a -> System.out.print(a + ","));
System.out.println();
}
private static void splitListRegex(String input) {
System.out.print("splitListRegex = ");
List<String> inputList = Arrays.asList(input.split("\\|"));
System.out.println(inputList);
}
private static void splitListRegexQuote(String input) {
System.out.print("splitListRegexQuote = ");
List<String> inputList = Arrays.asList(input.split(Pattern.quote("|")));
System.out.println(inputList);
}
private static void splitListRegexStream(String input) {
System.out.print("splitListRegexStream = ");
List<String> inputList = Stream.of(input.split("\\|")).collect(Collectors.toList());
System.out.println(inputList);
}
}
Dan hasilnya :
splitArrayRegex = Food1,Food2,Food3,Food4,
splitArrayRegexQuote = Food1,Food2,Food3,Food4,
splitListRegex = [Food1, Food2, Food3, Food4]
splitListRegexQuote = [Food1, Food2, Food3, Food4]
splitListRegexStream = [Food1, Food2, Food3, Food4]