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