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

我有一个任意字符串"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 。 我怎样才能解决这个问题?

首先,不要使用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 

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

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

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

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

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

在关键字的代码中需要一个“循环迭代器”,就像逻辑一样。 因此,我使用自己的索引和模运算符来确保当它到达关键字的末尾时,它将从头开始。

 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(); } 
  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”

问题是你只需要在字符串“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; } 
 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 
  1. O / P:hamha mh amha mh amhamha
  2. I / p:字符串
  s1="Hello Aunt Mary"; String s2="carl"; 

O / P:carlc arlc arlc

适用于任何I / P .. 🙂

你的程序应该是这个

 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")); } } 

只是为了练习,我尽可能使用Stream做了一个Java-8。

我欢迎评论/改进。

 public void test() { // My string. String s = "Hello! My name is Timothy."; // The key loops around the string "ham" Iterator 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 implements Iterator { // Where we are in the array. int i = 0; // The length to loop to. final int length; // The array to feed. final List a; public Loop(List a, int length) { this.a = a; this.length = length; } // Factories. private static Iterator of(String s, int length) { List 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