[runLength-en-decoding] run length encoding (#15735)
This commit is contained in:
		
							parent
							
								
									d3ed1933ee
								
							
						
					
					
						commit
						b490028e69
					
				| @ -0,0 +1,93 @@ | |||||||
|  | package com.baeldung.string.runlength; | ||||||
|  | 
 | ||||||
|  | import org.junit.jupiter.api.Test; | ||||||
|  | 
 | ||||||
|  | import java.util.Collections; | ||||||
|  | 
 | ||||||
|  | import static org.junit.jupiter.api.Assertions.assertEquals; | ||||||
|  | 
 | ||||||
|  | public class RunLengthEncodingUnitTest { | ||||||
|  |     private static final String INPUT = "WWWWWWWWWWWWBAAACCDEEEEE"; | ||||||
|  |     private static final String RLE = "12W1B3A2C1D5E"; | ||||||
|  | 
 | ||||||
|  |     String runLengthEncode(String input) { | ||||||
|  |         StringBuilder result = new StringBuilder(); | ||||||
|  |         int count = 1; | ||||||
|  |         char[] chars = input.toCharArray(); | ||||||
|  |         for (int i = 0; i < chars.length; i++) { | ||||||
|  |             char c = chars[i]; | ||||||
|  |             if (i + 1 < chars.length && c == chars[i + 1]) { | ||||||
|  |                 count++; | ||||||
|  |             } else { | ||||||
|  |                 result.append(count).append(c); | ||||||
|  |                 count = 1; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return result.toString(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     String runLengthDecode(String rle) { | ||||||
|  |         StringBuilder result = new StringBuilder(); | ||||||
|  |         char[] chars = rle.toCharArray(); | ||||||
|  | 
 | ||||||
|  |         int count = 0; | ||||||
|  |         for (char c : chars) { | ||||||
|  |             if (Character.isDigit(c)) { | ||||||
|  |                 count = 10 * count + Character.getNumericValue(c); | ||||||
|  |             } else { | ||||||
|  |                 result.append(String.join("", Collections.nCopies(count, String.valueOf(c)))); | ||||||
|  |                 count = 0; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return result.toString(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     String runLengthEncodeByRegEx(String input) { | ||||||
|  |         String[] arr = input.split("(?<=(\\D))(?!\\1)"); | ||||||
|  |         StringBuilder result = new StringBuilder(); | ||||||
|  |         for (String run : arr) { | ||||||
|  |             result.append(run.length()).append(run.charAt(0)); | ||||||
|  |         } | ||||||
|  |         return result.toString(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     String runLengthDecodeByRegEx(String rle) { | ||||||
|  |         if (rle.isEmpty()) { | ||||||
|  |             return ""; | ||||||
|  |         } | ||||||
|  |         String[] arr = rle.split("(?<=\\D)|(?=\\D+)"); | ||||||
|  |         if (arr.length % 2 != 0) { | ||||||
|  |             throw new IllegalArgumentException("Not a RLE string"); | ||||||
|  |         } | ||||||
|  |         StringBuilder result = new StringBuilder(); | ||||||
|  | 
 | ||||||
|  |         for (int i = 1; i <= arr.length; i += 2) { | ||||||
|  |             int count = Integer.parseInt(arr[i - 1]); | ||||||
|  |             String c = arr[i]; | ||||||
|  | 
 | ||||||
|  |             result.append(String.join("", Collections.nCopies(count, c))); | ||||||
|  |         } | ||||||
|  |         return result.toString(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void whenInvokingRunLengthEncode_thenGetExpectedResult() { | ||||||
|  |         assertEquals(RLE, runLengthEncode(INPUT)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void whenInvokingRunLengthDecode_thenGetExpectedResult() { | ||||||
|  |         assertEquals(INPUT, runLengthDecode(RLE)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void whenInvokingRunLengthEncodeByRegEx_thenGetExpectedResult() { | ||||||
|  |         assertEquals(RLE, runLengthEncodeByRegEx(INPUT)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void whenInvokingRunLengthDecodeByRegEx_thenGetExpectedResult() { | ||||||
|  |         assertEquals(INPUT, runLengthDecodeByRegEx(RLE)); | ||||||
|  |     } | ||||||
|  | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user