Java - String split ke Map
Pendahuluan awal mengenai split bisa dilihat di Java Split
Pendahuluan awal mengenai split menjadi List bisa dilihat di Java Split Pipes
Nah sekarang kita membahas tentang apa nih ?
Sebelumnya kita sudah membahas mengambil data yang pakai delimiter : dengan memakai String.split
Dan itu cukup mudah..
Nah sekarang ada kasus dimana kita mempunyai data inputan berupa String, yang didalamnya sebenarnya mirip-mirip dengan map.
Ada :
- Key
- Value
Tetapi dipisahkan oleh delimiter lainya.
Contoh :
- Sebelumnya kita punya contoh : String rat_values = “Food1|Food2|Food3|Food4”
- Ternyata ada yang butuh pemetaan sbb : String animal_foods = “rat:Food1|cat:Food2|dog:Food3|bat:Food4”
Tujuannya tentu saja sama dengan yang sebelumnya.
Yaitu untuk mempersingkat data, dan mempermudah dalam penyimpanan dan konversi data yang berupa tipe data String menjadi sebuah Map atau Dictionary.
Lalu ?
Ada kebutuhan untuk mengkonversi data String diatas tersebut ke dalam sebuah Map biar mudah diproses.
Misalnya untuk kasus diatas :
- 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 atau Map, maka akan lebih mudah bagi kita untuk memproses nya di logic program kita.
Bagaimana untuk mengubahnya menjadi Map ?
Di bahasa Java, kita bisa pakai cara :
1. Cara biasa , yaitu String.split(), di looping untuk tiap itemnya, displit lagi, di mapping ke Map
Untuk kasus ini kita perlu melakukan 2 kali String.split() karena ada 2 delimiter sebagai pembatas nya.
Yaitu :
- |
- :
String[] inputArr = input.split("\\|");
Map<String, String> itemMap = new HashMap<String, String>();
for (String s : inputArr) {
String[] inputItem = s.split(":");
itemMap.put(inputItem[0], inputItem[1]);
}
Isian regexnya split yang pertama 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.
2. Pakai String.split() + java Stream
Setelah Java 8, kita dapat menggunakan Stream untuk pemrosesan data berupa Array atau Collections.
Sehingga untuk kasus ini, kita dapat memanfaatkan String.split() dan diproses oleh Java Stream.
Map<String, String> itemMap = Stream.of(input.split("\\|")).map(item -> item.split(":"))
.collect(Collectors.toMap(entry -> entry[0], entry -> entry[1]));
System.out.println(itemMap);
Atau kalau pakai Pattern.quote
Map<String, String> itemMap = Stream.of(input.split(Pattern.quote("|"))).map(item -> item.split(":"))
.collect(Collectors.toMap(entry -> entry[0], entry -> entry[1]));
System.out.println(itemMap);
Contoh Code
Kalau kita coba kumpulkan contoh kode untuk kasus diatas sbb :
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class SplitMap {
public static void main(String[] args) {
String animal_foods = "rat:Food1|cat:Food2|dog:Food3|bat:Food4";
splitMapRegex(animal_foods);
splitMapRegexQuote(animal_foods);
splitMapRegexStream(animal_foods);
splitMapRegexStreamQuote(animal_foods);
}
private static void splitMapRegex(String input) {
System.out.print("splitMapRegex = ");
String[] inputArr = input.split("\\|");
Map<String, String> itemMap = new HashMap<String, String>();
for (String s : inputArr) {
String[] inputItem = s.split(":");
itemMap.put(inputItem[0], inputItem[1]);
}
System.out.println(itemMap);
}
private static void splitMapRegexQuote(String input) {
System.out.print("splitMapRegexQuote = ");
String[] inputArr = input.split(Pattern.quote("|"));
Map<String, String> itemMap = new HashMap<String, String>();
for (String s : inputArr) {
String[] inputItem = s.split(":");
itemMap.put(inputItem[0], inputItem[1]);
}
System.out.println(itemMap);
}
private static void splitMapRegexStream(String input) {
System.out.print("splitMapRegexStream = ");
Map<String, String> itemMap = Stream.of(input.split("\\|")).map(item -> item.split(":"))
.collect(Collectors.toMap(entry -> entry[0], entry -> entry[1]));
System.out.println(itemMap);
itemMap.entrySet().forEach(System.out::println);
}
private static void splitMapRegexStreamQuote(String input) {
System.out.print("splitMapRegexStreamQuote = ");
Map<String, String> itemMap = Stream.of(input.split(Pattern.quote("|"))).map(item -> item.split(":"))
.collect(Collectors.toMap(entry -> entry[0], entry -> entry[1]));
System.out.println(itemMap);
itemMap.entrySet().forEach(System.out::println);
}
}
Dan hasilnya :
splitMapRegex = {rat=Food1, bat=Food4, cat=Food2, dog=Food3}
splitMapRegexQuote = {rat=Food1, bat=Food4, cat=Food2, dog=Food3}
splitMapRegexStream = {rat=Food1, bat=Food4, cat=Food2, dog=Food3}
rat=Food1
bat=Food4
cat=Food2
dog=Food3
splitMapRegexStreamQuote = {rat=Food1, bat=Food4, cat=Food2, dog=Food3}
rat=Food1
bat=Food4
cat=Food2
dog=Food3