riya
riya

Reputation: 33

How to substring a given string with specific rules in java

This is my code and it is showing error at while.Index out of bound exception is coming.The substrings should be such that

  1. Max 50 characters per string
  2. No number should be broken - for example " 4318, 4466, 486," is acceptable but " 4318, 4466, 48" is not
  3. Substring should always start with one space and end with comma ","

can someone help me out with this please

 public class MyString {

/**
 * @param args

 */
static String input = " 4318, 4466, 486, 1698, 478, 590, 582, 1594, 486, 1690, 702, 378, 486, 586, 486, 1694, 486, 598, 538, 526, 486, 1694, 486, 622, 434, 630, 462, 1730, 422, 1754, 450, 586, 486, 1690, 498, 1682, 486, 586, 502, 606, 454, 1698, 478, 1694, 486, 1718, 458, 1686, 726, 1458, 646, 426, 486, 1694, 482, 1694, 486, 590, 482, 622, 490, 550, 490, 602, 450, 634, 466, 586, 486, 1730, 426, 1714, 494, 622, 446, 590, 494, 618, 450, 586, 490, 586, 486, 1730, 450, 586, 486, 590, 502, 1674, 530, 1650, 482, 1690, 558, 1622, 486, 1690, 486, 5298, 4306, 4466, 530, 1646, 486, 594, 650, 1502, 546, 1650, 490, 586, 486, 622, 522, 1622, 486, 602, 454, 634, 462, 1694, 482, 590, 486, 590, 486, 1694, 482, 1730, 450, 590, 498, 1638, 526, 1690, 498, 606, 458, 586, 486, 1698, 482, 1694, 482, 1690, 486, 1694, 486, 1698, 574, 494, 486, 1714, 462, 1690, 486, 626, 430, 610, 486, 590, 490, 622, 426, 610, 498, 618, 446, 1690, 486, 1734, 446, 590, 482, 590, 502, 606, 454, 590, 502, 582, 478, 1690, 486, 586, 506, 578, 482, 1686, 558, 1622, 674, 1506, 482, 1698, 590, 1606, 462, 1000";
char space=' ';
 static char comma=',';
public static void main(String[] args) {
    // TODO Auto-generated method stub
    int start=0, end=0;
    while (end-1 < input.length()){

    start=end;
    end= start+ 50;

    String output= input.substring(start,end);
    if(output.charAt(start)==' ' && output.charAt(end-1)==',')
    {
    System.out.println(output);
    } 
    else 
    {

    while(!(output.charAt(end-1)==','))
    {

    end--;

    }
    output= input.substring(start,end);
    System.out.println(output);

    }
    }
    }



}

Upvotes: 3

Views: 161

Answers (4)

VivekRatanSinha
VivekRatanSinha

Reputation: 616

public class StringSplitTest
{
    static String input = " 4318, 4466, 486, 1698, 478, 590, 582, 1594, 486, 1690, 702, 378, 486, 586, 486, 1694, 486, 598, 538, 526, 486, 1694, 486, 622, 434, 630, 462, 1730, 422, 1754, 450, 586, 486, 1690, 498, 1682, 486, 586, 502, 606, 454, 1698, 478, 1694, 486, 1718, 458, 1686, 726, 1458, 646, 426, 486, 1694, 482, 1694, 486, 590, 482, 622, 490, 550, 490, 602, 450, 634, 466, 586, 486, 1730, 426, 1714, 494, 622, 446, 590, 494, 618, 450, 586, 490, 586, 486, 1730, 450, 586, 486, 590, 502, 1674, 530, 1650, 482, 1690, 558, 1622, 486, 1690, 486, 5298, 4306, 4466, 530, 1646, 486, 594, 650, 1502, 546, 1650, 490, 586, 486, 622, 522, 1622, 486, 602, 454, 634, 462, 1694, 482, 590, 486, 590, 486, 1694, 482, 1730, 450, 590, 498, 1638, 526, 1690, 498, 606, 458, 586, 486, 1698, 482, 1694, 482, 1690, 486, 1694, 486, 1698, 574, 494, 486, 1714, 462, 1690, 486, 626, 430, 610, 486, 590, 490, 622, 426, 610, 498, 618, 446, 1690, 486, 1734, 446, 590, 482, 590, 502, 606, 454, 590, 502, 582, 478, 1690, 486, 586, 506, 578, 482, 1686, 558, 1622, 674, 1506, 482, 1698, 590, 1606, 462, 1000,";
    static ArrayList chunks = new ArrayList();
    static char comma = ',';
    static String commaString = ",";
    static boolean more = true;
    static int startIndex = 0;
    static String str = null;
    static int splitIndex = 50;
    static int remainingInputLength = 0;

    public static void main(String[] args)
    {
        while (more)
        {
            str = input.substring(startIndex, startIndex + splitIndex);
            if (str.endsWith(commaString))
            {
                startIndex += 50;
            }
            else
            {
                splitIndex = str.lastIndexOf(comma) + 1;
                str = input.substring(startIndex, startIndex + splitIndex);
                startIndex += splitIndex;
            }
            chunks.add(str);

            remainingInputLength = input.substring(startIndex).length();
            if (remainingInputLength == 0) 
            {
                more = false;
            }
            else 
            {
                if (remainingInputLength >= 50)
                    splitIndex = 50;
                else
                    splitIndex = remainingInputLength;
            }
        }
        for (String s: chunks) System.out.println(s);
    }
}

Upvotes: 0

Ravi
Ravi

Reputation: 31417

I have made slight modification in your code.

class Ideone {

static String input = " 4318, 4466, 486, 1698, 478, 590, 582, 1594, 486, 1690, 702, 378, 486, 586, 486, 1694, 486, 598, 538, 526, 486, 1694, 486, 622, 434, 630, 462, 1730, 422, 1754, 450, 586, 486, 1690, 498, 1682, 486, 586, 502, 606, 454, 1698, 478, 1694, 486, 1718, 458, 1686, 726, 1458, 646, 426, 486, 1694, 482, 1694, 486, 590, 482, 622, 490, 550, 490, 602, 450, 634, 466, 586, 486, 1730, 426, 1714, 494, 622, 446, 590, 494, 618, 450, 586, 490, 586, 486, 1730, 450, 586, 486, 590, 502, 1674, 530, 1650, 482, 1690, 558, 1622, 486, 1690, 486, 5298, 4306, 4466, 530, 1646, 486, 594, 650, 1502, 546, 1650, 490, 586, 486, 622, 522, 1622, 486, 602, 454, 634, 462, 1694, 482, 590, 486, 590, 486, 1694, 482, 1730, 450, 590, 498, 1638, 526, 1690, 498, 606, 458, 586, 486, 1698, 482, 1694, 482, 1690, 486, 1694, 486, 1698, 574, 494, 486, 1714, 462, 1690, 486, 626, 430, 610, 486, 590, 490, 622, 426, 610, 498, 618, 446, 1690, 486, 1734, 446, 590, 482, 590, 502, 606, 454, 590, 502, 582, 478, 1690, 486, 586, 506, 578, 482, 1686, 558, 1622, 674, 1506, 482, 1698, 590, 1606, 462, 1000";
char space = ' ';
static char comma = ',';

public static void main(String[] args) {
    // TODO Auto-generated method stub
    int start = 0, end = 0;
    int temp = 0;
    while (end < input.length()) {

        start = end;
        end = Math.min(start + 50, input.length());

        String output = input.substring(start, end - 1);
        if (output.charAt(0) == ' ' && output.charAt(output.length() - 1) == ',') {
            System.out.println(output);
            end--;
        } else {
            temp = output.length() - 1;
            while (temp!=-1 && output.charAt(temp) != ',') {
                temp--;
            }
            if(temp==-1)break;
            output = input.substring(start, start + temp + 1);
            System.out.println(output);
            end = start + temp + 1;
        }

    }
}
}

Demo

Upvotes: 1

nerdicsapo
nerdicsapo

Reputation: 427

 while(!(output.charAt(end-1)==','))    
{    
end--;    
}

change it to

 while(!(output.charAt(end-1)==','))
    {

  if(end>=1)
    end--;
  else
    break;

    }

You will not get error but you may want to change else part. Also, you didn't ask specifically but check this link out.

How to split a string in Java

Upvotes: 0

Balaj Narasimhan
Balaj Narasimhan

Reputation: 308

I dont understand the question but I think you are looking for this

  public class Snippet {
    static String input = " 4318, 4466, 486, 1698, 478, 590, 582, 1594, 486,            1690, 702, 378, 486, 586, 486, 1694, 486, 598, 538, 526, 486, 1694, 486, 622, 434, 630, 462, 1730, 422, 1754, 450, 586, 486, 1690, 498, 1682, 486, 586, 502, 606, 454, 1698, 478, 1694, 486, 1718, 458, 1686, 726, 1458, 646, 426, 486, 1694, 482, 1694, 486, 590, 482, 622, 490, 550, 490, 602, 450, 634, 466, 586, 486, 1730, 426, 1714, 494, 622, 446, 590, 494, 618, 450, 586, 490, 586, 486, 1730, 450, 586, 486, 590, 502, 1674, 530, 1650, 482, 1690, 558, 1622, 486, 1690, 486, 5298, 4306, 4466, 530, 1646, 486, 594, 650, 1502, 546, 1650, 490, 586, 486, 622, 522, 1622, 486, 602, 454, 634, 462, 1694, 482, 590, 486, 590, 486, 1694, 482, 1730, 450, 590, 498, 1638, 526, 1690, 498, 606, 458, 586, 486, 1698, 482, 1694, 482, 1690, 486, 1694, 486, 1698, 574, 494, 486, 1714, 462, 1690, 486, 626, 430, 610, 486, 590, 490, 622, 426, 610, 498, 618, 446, 1690, 486, 1734, 446, 590, 482, 590, 502, 606, 454, 590, 502, 582, 478, 1690, 486, 586, 506, 578, 482,   
1686, 558, 1622, 674, 1506, 482, 1698, 590, 1606, 462, 1000";
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int start=0, end=0;
        String[] a=input.split(",");
        System.out.println(a);
        for (int i = 0; i < a.length; i++) {

            System.out.print(a[i]);
            if(!(a.length-1==i))
            {
            System.out.print(",");
            }   
        }
    }
}

Upvotes: 0

Related Questions