转载

Java程序检查字符串是否是变位词

字符串变位词检查:有多种方法来查找两个字符串是变位词还是非变位词。经典的方法是获取每个字符串的字符数组,然后比较它们,如果两个字符数组都相等,那么字符串就是变位词。但在进行比较之前,请确保两个字符串的大小写相同(例如小写或大写),并且对字符数组进行排序,因为equals数组方法,只有当数组包含相同的长度,并且每个索引具有相同的字符时才返回true。

为了简单起见,我省略了检查字符串是否为空,并将其转换为大写或小写,如果需要,可以执行此操作。如果面试官要求你写生产质量代码,那么我建议你一定要做这些检查,并为空字符串抛出IllegalArgumentException,否则你只需返回false。我个人更喜欢返回false而不是抛出异常,类似于equals()方法。不管怎样,这里有三种方法来检查两个字符串是否是变位词。我还包括了一个JUnit测试来验证各种包含变位词和非变位词的字符串。

<b>import</b> java.util.Arrays;

<font><i>/**
 * Java program - String Anagram Example.
 * This program checks if two Strings are anagrams or not
 *
 * @author Javin Paul
 */</i></font><font>
<b>public</b> <b>class</b> AnagramCheck {
   
    </font><font><i>/*
     * One way to find if two Strings are anagram in Java. This method
     * assumes both arguments are not null and in lowercase.
     *
     * @return true, if both String are anagram
     */</i></font><font>
    <b>public</b> <b>static</b> <b>boolean</b> isAnagram(String word, String anagram){       
        <b>if</b>(word.length() != anagram.length()){
            <b>return</b> false;
        }
       
        <b>char</b>[] <b>char</b>s = word.toCharArray();
       
        <b>for</b>(<b>char</b> c : <b>char</b>s){
            <b>int</b> index = anagram.indexOf(c);
            <b>if</b>(index != -1){
                anagram = anagram.substring(0,index) + anagram.substring(index +1, anagram.length());
            }<b>else</b>{
                <b>return</b> false;
            }           
        }
       
        <b>return</b> anagram.isEmpty();
    }
   
    </font><font><i>/*
     * Another way to check if two Strings are anagram or not in Java
     * This method assumes that both word and anagram are not null and lowercase
     * @return true, if both Strings are anagram.
     */</i></font><font>
    <b>public</b> <b>static</b> <b>boolean</b> iAnagram(String word, String anagram){
        <b>char</b>[] <b>char</b>FromWord = word.toCharArray();
        <b>char</b>[] <b>char</b>FromAnagram = anagram.toCharArray();       
        Arrays.sort(charFromWord);
        Arrays.sort(charFromAnagram);
       
        <b>return</b> Arrays.equals(charFromWord, charFromAnagram);
    }
   
   
    <b>public</b> <b>static</b> <b>boolean</b> checkAnagram(String first, String second){
        <b>char</b>[] <b>char</b>acters = first.toCharArray();
        StringBuilder sbSecond = <b>new</b> StringBuilder(second);
       
        <b>for</b>(<b>char</b> ch : <b>char</b>acters){
            <b>int</b> index = sbSecond.indexOf(</font><font>""</font><font> + ch);
            <b>if</b>(index != -1){
                sbSecond.deleteCharAt(index);
            }<b>else</b>{
                <b>return</b> false;
            }
        }
       
        <b>return</b> sbSecond.length()==0 ? <b>true</b> : false;
    }
}
</font>

字符串变位词exmaple的JUnit测试用例

这是我们对anagramcheck类的三个方法的JUnit测试,我们实际上用类似的输入集测试了所有方法。

<b>import</b> org.junit.Test;
<b>import</b> <b>static</b> org.junit.Assert.*;

<font><i>/**
 * JUnit test class to test various anagram program for various String input.
 */</i></font><font>
<b>public</b> <b>class</b> StringAnagramTest {
   
 
    @Test
    <b>public</b> <b>void</b> testIsAnagram() {
        assertTrue(AnagramCheck.isAnagram(</font><font>"word"</font><font>, </font><font>"wrdo"</font><font>));
        assertTrue(AnagramCheck.isAnagram(</font><font>"mary"</font><font>, </font><font>"army"</font><font>));
        assertTrue(AnagramCheck.isAnagram(</font><font>"stop"</font><font>, </font><font>"tops"</font><font>));
        assertTrue(AnagramCheck.isAnagram(</font><font>"boat"</font><font>, </font><font>"btoa"</font><font>));
        assertFalse(AnagramCheck.isAnagram(</font><font>"pure"</font><font>, </font><font>"in"</font><font>));
        assertFalse(AnagramCheck.isAnagram(</font><font>"fill"</font><font>, </font><font>"fil"</font><font>));
        assertFalse(AnagramCheck.isAnagram(</font><font>"b"</font><font>, </font><font>"bbb"</font><font>));
        assertFalse(AnagramCheck.isAnagram(</font><font>"ccc"</font><font>, </font><font>"ccccccc"</font><font>));
        assertTrue(AnagramCheck.isAnagram(</font><font>"a"</font><font>, </font><font>"a"</font><font>));
        assertFalse(AnagramCheck.isAnagram(</font><font>"sleep"</font><font>, </font><font>"slep"</font><font>));
       
    }
   
    @Test
    <b>public</b> <b>void</b> testIAnagram() {
        assertTrue(AnagramCheck.iAnagram(</font><font>"word"</font><font>, </font><font>"wrdo"</font><font>));
        assertTrue(AnagramCheck.iAnagram(</font><font>"boat"</font><font>, </font><font>"btoa"</font><font>));
        assertFalse(AnagramCheck.iAnagram(</font><font>"pure"</font><font>, </font><font>"in"</font><font>));
        assertFalse(AnagramCheck.iAnagram(</font><font>"fill"</font><font>, </font><font>"fil"</font><font>));
        assertTrue(AnagramCheck.iAnagram(</font><font>"a"</font><font>, </font><font>"a"</font><font>));
        assertFalse(AnagramCheck.iAnagram(</font><font>"b"</font><font>, </font><font>"bbb"</font><font>));
        assertFalse(AnagramCheck.iAnagram(</font><font>"ccc"</font><font>, </font><font>"ccccccc"</font><font>));
        assertFalse(AnagramCheck.iAnagram(</font><font>"sleep"</font><font>, </font><font>"slep"</font><font>));
       
    }
    
    @Test
    <b>public</b> <b>void</b> testcheckAnagram() {
        assertTrue(AnagramCheck.checkAnagram(</font><font>"word"</font><font>, </font><font>"wrdo"</font><font>));       
        assertFalse(AnagramCheck.checkAnagram(</font><font>"b"</font><font>, </font><font>"bbb"</font><font>));
        assertFalse(AnagramCheck.checkAnagram(</font><font>"ccc"</font><font>, </font><font>"ccccccc"</font><font>));
        assertTrue(AnagramCheck.checkAnagram(</font><font>"a"</font><font>, </font><font>"a"</font><font>));
        assertFalse(AnagramCheck.checkAnagram(</font><font>"sleep"</font><font>, </font><font>"slep"</font><font>));
        assertTrue(AnagramCheck.checkAnagram(</font><font>"boat"</font><font>, </font><font>"btoa"</font><font>));
        assertFalse(AnagramCheck.checkAnagram(</font><font>"pure"</font><font>, </font><font>"in"</font><font>));
        assertFalse(AnagramCheck.checkAnagram(</font><font>"fill"</font><font>, </font><font>"fil"</font><font>));
       
    }
}

Output
Testsuite: StringAnagramTest
Tests run: 3, Failures: 0, Errors: 0, Time elapsed: 0.094 sec
</font>

我们的anagramcheck类包含3个静态方法来验证字符串是否为变位词。首先,获取第一个字符串的字符数组并循环遍历它,然后在第二个字符串中查找该字符,并使用substring方法删除它。如果第二个字符串不包含字符,则立即返回false。测试结束时,如果第二个字符串为空,则两个字符串都是变位词,因为它们包含相同的字符集。为了提高性能,我们在这个方法的最开始就检查了长度,因为两个长度不同的字符串不能互相变位。第三个方法与第一个方法完全相同,只是它使用StringBuilder的DeleteCharat(int index)方法删除字符。

原文  https://www.jdon.com/51804
正文到此结束
Loading...