Shawn
Shawn

Reputation: 307

java Run-length encoding

I have no idea how to start my assignment.

We got to make a Run-length encoding program,

for example, the users enters this string:

aaaaPPPrrrrr

is replaced with

4a3P5r

Can someone help me get started with it?

Upvotes: 0

Views: 40397

Answers (7)

Arjunan
Arjunan

Reputation: 1

With Java 8, can be achieved with simple split, counting and join them.

String runLengthText = Arrays.stream(s.split(""))
                .collect(Collectors.groupingBy(Function.identity(), LinkedHashMap::new, counting()))
                .entrySet()
                .stream().map(e -> e.getKey() + e.getValue())
                .collect(Collectors.joining(""));

Upvotes: 0

rahul uday
rahul uday

Reputation: 131

Here is my solution in java

public String encodingString(String s){
    StringBuilder encodedString = new StringBuilder();
    List<Character> listOfChars = new ArrayList<Character>();
    Set<String> removeRepeated = new HashSet<String>();
    //Adding characters of string to list
    for(int i=0;i<s.length();i++){
        listOfChars.add(s.charAt(i));
    }
    //Getting the occurance of each character and adding it to set to avoid repeated strings
    for(char j:listOfChars){
       String temp = Integer.toString(Collections.frequency(listOfChars,j))+Character.toString(j);
       removeRepeated.add(temp);
    }
    //Constructing the encodingString.
    for(String k:removeRepeated){
        encodedString.append(k);
    }
    return encodedString.toString();
}

Upvotes: 0

Satinath Mondal
Satinath Mondal

Reputation: 1

Try this out:

private static String encode(String sampleInput) {
    String encodedString = null;
    //get the input to a character array.
    //  String  sampleInput = "aabbcccd";
    char[] charArr = sampleInput.toCharArray();
    char prev=(char)0;
    int  counter =1;
    //compare each element with its next element and 
    //if same increment the counter
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < charArr.length; i++) {
        
        if(i+1 < charArr.length && charArr[i] == charArr[i+1]){
            counter ++;
        }else {
            //System.out.print(counter + Character.toString(charArr[i]));
            sb.append(counter + Character.toString(charArr[i]));
            counter = 1;
        }
        
    }
    return sb.toString();
}

Upvotes: 0

Ian Hoyos
Ian Hoyos

Reputation: 115

This can easily and simply be done using a StringBuilder and a few helper variables to keep track of how many of each letter you've seen. Then just build as you go.

For example:

static String encode(String s) {
    StringBuilder sb = new StringBuilder();
    char[] word = s.toCharArray();
    char current = word[0]; // We initialize to compare vs. first letter

           // our helper variables
    int index = 0; // tracks how far along we are
    int count = 0; // how many of the same letter we've seen

    for (char c : word) {
        if (c == current) {
            count++;
            index++;

            if (index == word.length)
                sb.append(current + Integer.toString(count));
        }

        else {
            sb.append(current + Integer.toString(count));
            count = 1;
            current = c;
            index++;
        }
    }
    return sb.toString();
}

Since this is clearly a homework assignment, I challenge you to learn the approach and not just simply use the answer as the solution to your homework. StringBuilders are very useful for building things as you go, thus keeping your runtime O(n) in many cases. Here using a couple of helper variables to track where we are in the iteration "index" and another to keep count of how many of a particular letter we've seen "count", we keep all necessary info for building our encoded string as we go.

Upvotes: 1

Jyoti Vaidya
Jyoti Vaidya

Reputation: 3

import java.util.Scanner;
/**
 * @author jyotiv
 *
 */
 public class RunLengthEncoding {
 /**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    System.out.println("Enter line to encode:");
    Scanner s=new Scanner(System.in);
    String input=s.nextLine();
            int len = input.length();
            int i = 0;
            int noOfOccurencesForEachChar = 0;
            char storeChar = input.charAt(0);

            String outputString = "";
            for(;i<len;i++)
            {
                if(i+1<len)
                {
                    if(input.charAt(i) == input.charAt(i+1))
                    {
                        noOfOccurencesForEachChar++;
                    }
                    else
                    {
                        outputString = outputString + 
   Integer.toHexString(noOfOccurencesForEachChar+1) + storeChar;
                        noOfOccurencesForEachChar = 0;
                        storeChar = input.charAt(i+1);
                    }
                }
                else
                {
                    outputString = outputString + 
 Integer.toHexString(noOfOccurencesForEachChar+1) + storeChar;
                }
            }

            System.out.println("Encoded line is: " + outputString);   

        }

}

I have tried this one. It will work for sure.

Upvotes: -1

Pardeep
Pardeep

Reputation: 1005

public String runLengthEncoding(String text) {
    String encodedString = "";

    for (int i = 0, count = 1; i < text.length(); i++) {
        if (i + 1 < text.length() && text.charAt(i) == text.charAt(i + 1))
            count++;
        else {
            encodedString = encodedString.concat(Integer.toString(count))
                    .concat(Character.toString(text.charAt(i)));
            count = 1;
        }
    }
    return encodedString;
}

Try this one out.

Upvotes: 1

Eric J.
Eric J.

Reputation: 150108

Hopefully this will get you started on your assignment:

The fundamental idea behind run-length encoding is that consecutively occurring tokens like aaaa can be replaced by a shorter form 4a (meaning "the following four characters are an 'a'"). This type of encoding was used in the early days of computer graphics to save space when storing an image. Back then, video cards supported a small number of colors and images commonly had the same color all in a row for significant portions of the image)

You can read up on it in detail on Wikipedia

http://en.wikipedia.org/wiki/Run-length_encoding

In order to run-length encode a string, you can loop through the characters in the input string. Have a counter that counts how many times you have seen the same character in a row. When you then see a different character, output the value of the counter and then the character you have been counting. If the value of the counter is 1 (meaning you only saw one of those characters in a row) skip outputting the counter.

Upvotes: 6

Related Questions