此函数应该采用字符串并以相反的顺序返回字符。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_user_interface);
mShoppingList = (ListView) findViewById(R.id.shopping_listView);
mItemEdit = (EditText) findViewById(R.id.item_editText);
mAddButton = (Button) findViewById(R.id.add_button);
mAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1);
mShoppingList.setAdapter(mAdapter);
mAddButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String item = mItemEdit.getText().toString();
final String Art=item;
mAdapter.add(item);
mAdapter.notifyDataSetChanged();
mItemEdit.setText("");
然而所有测试都返回false:
def reverse(string)
reversedString = "";
i = string.length - 1
while i >= 0
reversedString = reversedString + string[i]
i -= 1
end
puts reversedString
end
有谁看到问题是什么?
答案 0 :(得分:4)
尝试使用默认的String类reverse
方法,如下所示:
"Hello World".reverse
"Hello World".reverse!
在https://ruby-doc.org/core-2.4.0/String.html
检查Ruby的String类API如果您想制作自定义方法,可以使用以下地图:
string = String.new
"Hello World".chars.each { | c | string.prepend c }
答案 1 :(得分:2)
问题是你的功能没有返回它的结果,它正在打印它。它需要return reversedString
。
根据经验,函数应该返回结果。另一个功能应该格式化并打印它。
def reverse(string)
reversedString = "";
i = string.length - 1
while i >= 0
reversedString = reversedString + string[i]
i -= 1
end
return reversedString
end
注意:这可能是一个练习,但Ruby已经有String#reverse。
你写测试很好,但是你写它们的方式很难说出错了。查看像MiniTest这样的Ruby测试框架。
require "minitest/autorun"
class TestReverse < Minitest::Test
def test_reverse
assert_equal "cba", reverse("abc")
assert_equal "a", reverse("a")
assert_equal "", reverse("")
end
end
那会告诉你,你的函数正在返回nil
。
1) Failure:
TestReverse#test_reverse [test.rb:16]:
Expected: "cba"
Actual: nil
答案 2 :(得分:2)
为了使这更像Ruby,但避免使用内置的String#reverse
方法,你可以这样做:
def reverse(string)
string.chars.reverse.join('')
end
请记住,在Ruby中,上一次操作的结果是自动方法的返回值。在你的情况下,最后一个操作是puts
,它总是返回nil
,吃掉你的价值。你想传递它。
尝试设计具有简单任务的方法,也就是说,此功能应专注于仅执行一个作业和一个作业:反转字符串。显示它超出了这个要求,所以这是另一种方法的工作,也许是调用者。
要避免调用任何类型的reverse
方法:
def reverse(string)
result = ''
length = string.length
length.times do |i|
result << string[length - 1 - i]
end
result
end
如果您使用for
或范围while
之类的内容进行迭代,您通常可以经常避免times
几乎完全避免(0..n)
{/ 1}}。
答案 3 :(得分:1)
puts
打印并返回nil
,因此整个方法返回nil
。如果出于调试原因,您想要检查返回的方法,请使用p
返回它的参数(在本例中为reversedString)。
def reverse(string)
reversedString = ""
i = string.length - 1
while i >= 0
reversedString = reversedString + string[i]
i -= 1
end
p reversedString # !!!
end
并且所有3个测试都返回true
答案 4 :(得分:0)
如果我打算这样做,我可能会利用一个阵列:
ary = 'foo bar baz'.chars
reversed_ary = []
ary.size.times do
reversed_ary << ary.pop
end
reversed_ary.join # => "zab rab oof"
pop
从数组中删除最后一个字符并将其返回,所以基本上它会向后走过ary
,在最后啃着并将每个字符推到reversed_ary
的末尾颠倒阵列。
或者可以使用字符串来完成:
ary = 'foo bar baz'.chars
reversed_str = ''
ary.size.times do
reversed_str << ary.pop
end
reversed_str # => "zab rab oof"
或:
reversed_str += ary.pop
我刚看到@tadman对字符串做了类似的事情。他会跑得更快,但这更具可读性,至少对我而言。