创建两个相同长度的字符串,一个复制另一个结构,同时反复循环相同的字母

时间:2013-11-28 08:04:07

标签: java

我有一个任意字符串"hello my name is timothy"和另一个任意'关键字'字符串"ham"。我想创建一个方法,通过反复重复其字符,同时保留空格,使第二个字符串与第一个字符串的长度相同,结构相同。结果将是:"hamha mh amha mh amhamha。到目前为止,这是我的代码:

    public String makeStringsEqual(String str, String keyword)
{
    if (str.length() > keyword.length())
    {
        for(int i = 0; i < str.length(); i++)
        {
            if (str.charAt(i) != ' ')
            {
                keyword += keyword.charAt(i);
            }
            else
                keyword += " ";
        }

    }
    return keyword;
}

上一个示例的代码返回hamhamha ha ha。我怎样才能解决这个问题?

8 个答案:

答案 0 :(得分:4)

首先,不要使用keyword += (string),使用StringBuilder会更快。

public static String makeStringEqual(String str, String keyword) {
    StringBuilder sb = new StringBuilder("");
    if (str.length() > keyword.length()) {

        int j = 0; // this tells you what is the current index for the keyword
        for(int i=0;i<str.length();i++) {
            if (str.charAt(i) == ' ') {
                sb.append(' ');
            } else {
                sb.append(keyword.charAt(j));

                // when you use up a keyword's character, move on to the next char
                j++;

                // make sure to loop back to the start when you're at the end
                j %= keyword.length();
            }
        }
    }
    return sb.toString();
}

答案 1 :(得分:3)

我会给你一些提示,但不是答案。这似乎是一个学习课程,所以你应该先自己尝试一下。

  1. 您不应该处理作为方法参数的变量。在您的方法中,您正在处理keyword,从而更改它。不好。此外,您正在构建字符串。请继续阅读有关StringBuilder类的内容。

  2. 显然,您必须跟踪关键字的哪个字符应放在输出的下一个位置。你怎么能实现这个目标?

  3. 你的for循环是好的,因为你必须遍历整个输入字符串(这里是str),否则你将无法得到它的结构。其他一切都在这个循环中发生。

  4. 您是否可以使用这些提示修复方法?

答案 2 :(得分:2)

您需要在关键字的代码中使用“循环迭代器”之类的逻辑。因此,我使用自己的索引和模运算符来确保在关键字结束时它将从头开始。

public static String makeStringsEqual(String str, String keyword) {
    StringBuilder equalStringBuilder = new StringBuilder();
    if (str.length() > keyword.length()) {
        int keywordIndex = 0;
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) != ' ') {
                equalStringBuilder.append(keyword.charAt(keywordIndex++));
                keywordIndex %= keyword.length();
            } else {

                equalStringBuilder.append(' ');
            }
        }

    }
    return equalStringBuilder.toString();
}

答案 3 :(得分:1)

    String str = "hello my name is timothy";
    String keyword = "ham";

    String result = "";

    int i = 0;
    int j = 0;
    while (i < str.length()) {
        result += str.charAt(i) == ' ' ? ' ' : keyword.charAt(j++);
        if (j >= keyword.length()) j = 0;
        i++;
    }

    System.out.println(result); 

将打印“hamha mh amha mh amhamha”

答案 4 :(得分:1)

问题是你只需要在字符串“ham”中添加更多文本。这意味着当您从“str”中的索引0开始时,在“关键字”中,您的第一个字符将位于索引str.length,在这种情况下为3。

如果你使用一个新的字符串变量,你将从索引0开始。但是当你试图访问索引i为“str”时要注意indexoutofboundsexception,你必须使用模数来避免:

public String makeStringsEqual(String str, String keyword)
{
    if (str.length() > keyword.length())
    {
        string result = "";
        for(int i = 0; i < str.length(); i++)
        {
            if (str.charAt(i) != ' ')
            {
                result += keyword.charAt(i % keyword.length());
            }
            else
                result += " ";
        }

    }
    return result;
}

答案 5 :(得分:1)

public static void main (String args[]){
       String s1="hello my name is timothy";
       String s2="ham";
       List al = new ArrayList();
       String s3="";
       int k=0;
       for(int i=0;i<s1.length();i++)
       {   if(k==s2.length())
       {
           k=0;
       }
           if(s1.charAt(i)==' ')
           {  s3=s3+" ";
               continue;
           }
           else
           {
               s3=s3+s2.charAt(k++);
           }

       }
       System.out.println(s3);
    }
  
      
  1. O / P:hamha mh amha mh amhamha
  2.   
  3. I / p:String
  4.   
   s1="Hello Aunt Mary";
   String s2="carl";
  

O / P:carlc arlc arlc

适用于任何I / P .. :)

答案 6 :(得分:0)

你的程序应该是这个

public class Ham {

    public static String makeStringsEqual(String str, String keyword) {
        String ret = "";
        int spaces = 0;

        if (str.length() > keyword.length()) {
            for(int i = 0; i < str.length(); i++) {
                if (str.charAt(i) != ' ') {
                    ret += keyword.charAt((i - spaces) % keyword.length());
                } else {
                    spaces++;
                    ret += " ";
                }
            } 
        }

        return ret;
    }
    public static void main(String[] args) {
        System.out.println(makeStringsEqual("hello my name is timothy", "ham"));
    }

}

如果你不明白如何使用这里%,那么你可以有另一个版本(更简单:))

public class Ham2 {

    public static String makeStringsEqual(String str, String keyword) {
        String ret = "";
        int ci     = 0; //current letter index in keyword

        if (str.length() > keyword.length()) {
            for(int i = 0; i < str.length(); i++) {
                if (str.charAt(i) != ' ') {
                    if (ci == keyword.length()) {
                        ci = 0;
                    }
                    ret += keyword.charAt(ci);
                    ci++;
                } else {
                    ret += " ";
                }
            } 
        }

        return ret;
    }
    public static void main(String[] args) {
        System.out.println(makeStringsEqual("hello my name is timothy", "ham"));
    }

}

答案 7 :(得分:0)

就我的做法而言,我尽可能使用Stream做了一个Java-8。

我欢迎评论/改进。

public void test() {

  // My string.
  String s = "Hello! My name is Timothy.";
  // The key loops around the string "ham"
  Iterator<Integer> k = Loop.of("ham", s.length());
  System.out.println(s);
  String result = s.codePoints()
          .map(c -> c == ' ' ? ' ' : k.next())
          .collect(StringBuilder::new,
                   StringBuilder::appendCodePoint,
                   StringBuilder::append)
          .toString();
  System.out.println(result);

}

static class Loop<T> implements Iterator<T> {

  // Where we are in the array.
  int i = 0;
  // The length to loop to.
  final int length;
  // The array to feed.
  final List<T> a;

  public Loop(List<T> a, int length) {
    this.a = a;
    this.length = length;
  }

  // Factories.
  private static Iterator<Integer> of(String s, int length) {
    List<Integer> a = new ArrayList(s.length());

    for (int i = 0; i < s.length(); i++) {
      a.add(s.codePointAt(i));
    }
    return new Loop(a, length);
  }

  @Override
  public boolean hasNext() {
    return i < length;
  }

  @Override
  public T next() {
    return a.get((i++) % a.size());
  }

}

打印

Hello! My name is Timothy.
hamham ha mham ha mhamhamh