Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建两个长度相同的字符串,一个复制另一个';s结构,同时反复循环相同的字母_Java - Fatal编程技术网

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

Java 创建两个长度相同的字符串,一个复制另一个';s结构,同时反复循环相同的字母,java,Java,我有一个任意字符串“你好,我的名字是蒂莫西”和另一个任意的“关键字”字符串“ham”。我想创建一个方法,通过一遍又一遍地重复其字符,同时保留空格,使第二个字符串与第一个字符串长度相同,结构相同。结果将是:“hamha mh amha mh amhamha。以下是我目前的代码: public String makeStringsEqual(String str, String keyword) { if (str.length() > keyword.length())

我有一个任意字符串
“你好,我的名字是蒂莫西”
和另一个任意的“关键字”字符串
“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;
}
公共字符串makeStringsEqual(字符串str,字符串关键字)
{
if(str.length()>关键字.length())
{
对于(int i=0;i

上一个示例中的代码返回
hamha-ha
。我如何解决此问题?

我将给您一些提示,但不是答案。这似乎是一个学习课程,因此您应该首先自己尝试

  • 您不应使用作为方法参数的变量。在您的方法中,您使用的是
    关键字
    ,因此会对其进行更改。这不好。此外,您正在生成字符串。请转到并阅读有关类StringBuilder的信息

  • 显然,您必须跟踪关键字的哪个字符应该放在输出的下一个字符中。您如何做到这一点

  • 你的
    for
    循环很好,因为你必须在整个输入字符串上循环(这里是
    str
    ),否则你就得不到它的结构。其他一切都发生在这个循环中


  • 您能用这些提示修复您的方法吗?

    首先,不要使用
    关键字+=(字符串)
    ,使用
    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();
    }
    
    公共静态字符串makeStringEqual(字符串str,字符串关键字){
    StringBuilder sb=新的StringBuilder(“”);
    if(str.length()>关键字.length()){
    int j=0;//这告诉您关键字的当前索引是什么
    
    对于(inti=0;i您的程序应该是这样的

    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"));
        }
    
    }
    
    公共类Ham{
    公共静态字符串makeStringsEqual(字符串str,字符串关键字){
    字符串ret=“”;
    int空间=0;
    if(str.length()>关键字.length()){
    对于(int i=0;i
    如果您不了解此处的%是如何使用的,则可以使用另一个版本(更简单:)

    公共类Ham2{
    公共静态字符串makeStringsEqual(字符串str,字符串关键字){
    字符串ret=“”;
    int ci=0;//关键字中的当前字母索引
    if(str.length()>关键字.length()){
    对于(int i=0;i
    String str=“你好,我叫蒂莫西”;
    字符串关键字=“ham”;
    字符串结果=”;
    int i=0;
    int j=0;
    而(i=关键字.length())j=0;
    i++;
    }
    系统输出打印项次(结果);
    
    将打印“hamha mh amha mh amhamha”

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

    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();
    }
    
    public静态字符串makeStringsEqual(字符串str,字符串关键字){
    StringBuilder equalStringBuilder=新StringBuilder();
    if(str.length()>关键字.length()){
    int关键字索引=0;
    对于(int i=0;i
    问题在于,您只需在字符串“ham”中添加更多文本。这意味着,当您从“str”中的索引0开始时,“keyword”中的第一个字符将位于索引str.length,在本例中为3

    如果使用新的字符串变量,将从索引0开始。但是,当您尝试访问“str”的索引i时,请注意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;
    }
    
    公共字符串makeStringsEqual(字符串str,字符串关键字)
    {
    if(str.length()>关键字.length())
    {
    字符串结果=”;
    对于(int i=0;i
    O/p:carlc arlc arlc


    适用于任何I/p.:)

    仅在实践中,我尽可能使用
    Stream
    s做了一个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());
      }
    
    }
    

    使用另一个字符串变量instea
    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;
    }
    
    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);
        }
    
       s1="Hello Aunt Mary";
       String s2="carl";
    
    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