我有一个任意字符串"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
。我怎样才能解决这个问题?
答案 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)
我会给你一些提示,但不是答案。这似乎是一个学习课程,所以你应该先自己尝试一下。
您不应该处理作为方法参数的变量。在您的方法中,您正在处理keyword
,从而更改它。不好。此外,您正在构建字符串。请继续阅读有关StringBuilder类的内容。
显然,您必须跟踪关键字的哪个字符应放在输出的下一个位置。你怎么能实现这个目标?
你的for
循环是好的,因为你必须遍历整个输入字符串(这里是str
),否则你将无法得到它的结构。其他一切都在这个循环中发生。
您是否可以使用这些提示修复方法?
答案 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);
}
- O / P:hamha mh amha mh amhamha
- I / p:String
醇>
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