vdogsandman
vdogsandman

Reputation: 5417

Returning added string to

I'm trying to return strings in different lines given these conditions. Since I cannot use the += in Java with strings, how do I make one giant string that is spaced per line but "stacks?" In other words, how do I add a new string within a loop to an old string?

/**
   Returns a String that concatenates all "offending"
   words from text that contain letter; the words are
   separated by '\n' characters; the returned string
   does not contain duplicate words: each word occurs
   only once; there are no punctuation or whitespace
   characters in the returned string.

   @param letter character to find in text
   @return String containing all words with letter
 */
public String allWordsWith(char letter)
{
    String result = "";

    int i = 0;
    while (i < text.length())
    {
        char newchar = text.charAt(i);
        if (newchar == letter)
        {
            int index1 = text.lastIndexOf("",i);
            int index2 = text.indexOf("",i);
            String newstring = '\n' + text.substring(index2,index1);
        }
        i++;
    }
    return result;
}

Upvotes: 0

Views: 457

Answers (5)

Autocrab
Autocrab

Reputation: 3757

String text = "I have android code with many different java, bmp and xml files everywhere in my project that I used during the drafting phase of my project.";
String letter = "a";
Set<String> duplicateWordsFilter = new HashSet<String>(Arrays.asList(text.split(" ")));
StringBuilder sb = new StringBuilder(text.length());
for (String word : duplicateWordsFilter) {
    if (word.contains(letter)) {
        sb.append(word);
        sb.append("\n");
    }
}
return sb.toString();

result is:

android
have
java,
drafting
and
many
that
phase

Upvotes: 0

Sumit Singh
Sumit Singh

Reputation: 15896

Use StringBuilder as following:

public String allWordsWith(char letter){
 //String result = ""; 
 StringBuilder result = new StringBuilder();
 int i = 0;
 while (i < text.length()){
    char newchar = text.charAt(i);
    if (newchar == letter){
        int index1 = text.lastIndexOf("",i);
        int index2 = text.indexOf("",i);
        result.append('\n' + text.substring(index2,index1));
    }
    i++;
 }
 return result.toString();
}

Upvotes: 0

Byron Lo
Byron Lo

Reputation: 464

First, use a StringBuilder.

Second, use System.getProperty("line.separator") to ensure proper line breaks are used.

Edited code:

public String allWordsWith(char letter)
{
    StringBuilder sb = new StringBuilder();

    int i = 0;
    while (i < text.length())
    {
        char newchar = text.charAt(i);
        if (newchar == letter)
        {
            int index1 = text.lastIndexOf("",i);
            int index2 = text.indexOf("",i);
            sb.Append(text.substring(index2,index1));
            sb.Append(System.getProperty("line.separator"));
            //I put the new line after the word so you don't get an empty 
            //line on top, but you can do what you need/want to do in this case.
        }
        i++;
    }
    return result;
}

Upvotes: 0

Thomas W
Thomas W

Reputation: 14164

Modify the result string, and fix your "word boundary" tests.

if (newchar == letter) {
    int index1 = text.lastIndexOf(' ',i);
    int index2 = text.indexOf(' ',i);
    // TODO -- handle when index1 or index2 is < 0;  that means it wasn't found, 
    //  and you should use the string boundary (0 or length()) instead.
    String word = text.substring( index2,index1);
    result += "\n" + word;
}

If you were really concerned about performance you could use a StringBuilder and append(), but otherwise I strongly favour += for being concise & readable.

Upvotes: 1

Juned Ahsan
Juned Ahsan

Reputation: 68715

you are re-initializing your string in loop every time. Move the string declaration outsid eof loop:

Replace this

        String newstring = '\n' + text.substring(index2,index1);

with

        result = '\n' + text.substring(index2,index1);

Upvotes: 1

Related Questions