我使用的是Ruby 2.4。我想写一个比较字符串并声明它们的函数" equal"如果所有字符都匹配,或者两个字符串具有相同的字符数和除一个字符之外的所有字符匹配。例如,通过该逻辑,这些字符串将匹配
wonder
wander
唯一的区别是" o"和" a"。这些也匹配
zzz
zza
但这些不符合
abcdef
abcdef1
因为上面没有相同数量的字符。我该如何编写这样的函数?
答案 0 :(得分:2)
这适用于您的特定情况:
def str_equal(a, b)
a == b || (a.size == b.size && a.chars.map.with_index{|c, i| c == b[i]}.count(false) == 1)
end
答案 1 :(得分:1)
使用Ryan和nicooga的评论,以及必要的缺失部分:
使用meta的建议更新了
def close_enough(str1, str2)
return false unless str1.size == str2.size
mismatches = str1
.chars
.zip(str2.chars)
.count{ |(x, y)| x != y }
(mismatches <= 1)
end
答案 2 :(得分:1)
当两个字符串的大小不同或者差异超过一个字符时,以下方法将返回false
。我设计了一种方法,一旦确定要返回false
,就会使计算短路,但仍能有效确定true
返回值。
def at_most_one_character_different?(str1, str2)
str1.size == str2.size &&
(str1 == str2 || str1.size.times.one? { |i| str1[i] != str2[i] })
end
at_most_one_character_different? "", "" #=> true
at_most_one_character_different? "humpty", "humpty" #=> true
at_most_one_character_different? "humpty", "dumpty" #=> true
at_most_one_character_different? "humpty", "dumbty" #=> false
at_most_one_character_different? "humpty", "humptye" #=> false
答案 3 :(得分:1)
如果您确定没有unicode或其他多字节字符,则可以通过比较字节而不是实际字符来获得较小的性能提升。 (仅仅因为所有其他质量答案都已被采纳)
def at_most_one_byte_diff?(str1, str2)
return false if str1.size != str2.size
str1 == str2 || str1.each_byte.with_index.one? { |b,i| b != str2.getbyte(i) }
end
答案 4 :(得分:0)
您可以将差值计数作为参数传递:
<?php
$user_id = get_current_user_id();
$args = array( 'author' => $user_id, 'post_type' => 'any' );
// The Query
$the_query = new WP_Query( $args );
// The Loop
if ( $the_query->have_posts() ) {
echo '<ul>';
while ( $the_query->have_posts() ) {
$the_query->the_post();
echo '<li>' . get_the_title() . '</li>';
}
echo '</ul>';
/* Restore original Post Data */
wp_reset_postdata();
} else {
// no posts found
}
?>