lots of exercises in java... from https://github.com/exercism/java

RunLengthEncoding.java 1.8KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import java.util.regex.Matcher;
  2. import java.util.regex.Pattern;
  3. class RunLengthEncoding {
  4. String encode(String data) {
  5. StringBuilder encodedDataBuilder = new StringBuilder();
  6. if (data.length() == 0) {
  7. return data;
  8. }
  9. int previousCharCount = 1;
  10. char previousChar = data.charAt(0);
  11. for (int i = 1; i < data.length(); i++) {
  12. char currentChar = data.charAt(i);
  13. if (previousChar == currentChar) {
  14. previousCharCount++;
  15. }
  16. if (previousChar != currentChar || i == data.length() - 1) {
  17. addChars(encodedDataBuilder, previousChar, previousCharCount);
  18. if (previousChar != currentChar && i == data.length() - 1) {
  19. addChars(encodedDataBuilder, currentChar, 1);
  20. }
  21. previousChar = currentChar;
  22. previousCharCount = 1;
  23. }
  24. }
  25. return encodedDataBuilder.toString();
  26. }
  27. void addChars(StringBuilder toAddTo, char toAdd, int countOfChar) {
  28. if(countOfChar != 1) {
  29. toAddTo.append(countOfChar);
  30. }
  31. toAddTo.append(toAdd);
  32. }
  33. String decode(String encodedData) {
  34. StringBuilder decodedData = new StringBuilder();
  35. Pattern pattern = Pattern.compile("[0-9]+|[a-zA-Z\\s]");
  36. Matcher matcher = pattern.matcher(encodedData);
  37. while (matcher.find()) {
  38. try {
  39. int number = Integer.parseInt(matcher.group());
  40. matcher.find();
  41. for (int i = 0; i<number; i++) {
  42. decodedData.append(matcher.group());
  43. }
  44. } catch (NumberFormatException e) {
  45. decodedData.append(matcher.group());
  46. }
  47. }
  48. return decodedData.toString();
  49. }
  50. }