2013-03-14 52 views
1

我有两个ArrayList<String> s。一个包含标点符号和大写字母,另一个则删除。在读取打印条件时打印ArrayList

列表1:

File word: it's 
File word: Sit 
File word: yes-man 
File word: murdered 
File word: ok 
File word: DereDrum 
File word: Hello 
File word: Friend 

列表2:

Edited word: its 
Edited word: sit 
Edited word: yesman 
Edited word: murdered 
Edited word: ok 
Edited word: deredrum 
Edited word: hello 
Edited word: friend 

当时的想法是检查,看看哪些词是彼此的字谜。如果他们成功了,所有我想要做的就是重新打印,但与在同一行中相互字谜的话:

it's Sit 

yes-man 

murdered DereDrum 

ok 

hello 

friend 

我试图做到这一点,像这样:

 for (int i = 0; i < words.size(); i++) 
     { 
      System.out.print(words.get(i)); 
      for (int j = i+1; j < grams.size(); j++) 
      { 
       anagramChecker(grams.get(i),"",grams.get(j),words.get(j)); 
      } 
      System.out.println(); 
     } 

我记住的方式是这个for循环持续List1(单词)的大小并打印它正在查看的单词。然后,我用我的anagramChecker:

public static void anagramChecker(String s1,String s2,String checked,String word) 
{ 
    if(s1.length() == 0) 
    { 
     if(s2.equals(checked)) 
     { 
      System.out.println(" " + word); 
      return; 
     } 
    } 
    for(int i = 0 ; i < s1.length() ; i++) 
    { 
     anagramChecker(s1.substring(0, i) + s1.substring(i+1, s1.length()),s2 + s1.charAt(i),checked,word); 
    } 
} 

此方法不起作用,它的输出是这样的:

it's 
Sit yes-man 
yes-man 
yes-man 
yes-man 
yes-man 
yes-man 
yes-man 
yes-man 

yes-man 
murdered 
ok 
DereDrum Hello 

Hello 
Friend 

我试图用一张地图,这样我可以的话后,按字母顺序本身是排序的话在第二个列表中按字母顺序排序。这有相同的看起来输出。

+3

对于anagram检查不使用递归。将每个字符串复制到'char []',***对数组进行排序,然后进行简单的字符串比较。显然,首先检查等长。 – 2013-03-14 04:50:09

+0

@Jim Garrison如果我这样做,第一个ArrayList不会被第二个ArrayList排序。由于我试图打印第一个的结果,就像第二个结果一样,我不确定这会起作用。 – 2013-03-14 05:16:35

回答

1

再次这样做...和别人已经告诉过你的关键点。 把它放到char数组中,对它进行排序,比较它,完成。

package array; 

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.HashMap; 

public class Anagrams { 

    private static ArrayList<Character> convert(String txt) { 
    ArrayList<Character> alph = new ArrayList<Character>(); 
    for (int i = 0; i < txt.length(); i++) 
     if (Character.isLetter(txt.charAt(i))) 
     alph.add(Character.toLowerCase(txt.charAt(i))); 
    Collections.sort(alph); 
    return alph; 
    } 

    public static void main(String[] args) { 
    ArrayList<String> first = new ArrayList<String>(); 
    first.add("it's"); 
    first.add("Sit"); 
    first.add("yes-man"); 
    first.add("murdered"); 
    first.add("ok"); 
    first.add("DereDrum"); 
    first.add("Hello"); 
    first.add("Friend"); 

    ArrayList<String> second = new ArrayList<String>(); 
    second.add("its"); 
    second.add("sit"); 
    second.add("yesman"); 
    second.add("murdered"); 
    second.add("ok"); 
    second.add("deredrum"); 
    second.add("hello"); 
    second.add("friend"); 

    ArrayList<Integer> checked = new ArrayList<Integer>(); 

    for (int i = 0; i < first.size(); i++) { 
     String line = ""; 
     if (!checked.contains(i)) 
     line += first.get(i) + " "; 

     ArrayList<Character> firstChrAry = convert(first.get(i)); 

     for (int j = i + 1; j < second.size(); j++) { 
     ArrayList<Character> secondChrAry = convert(second.get(j)); 
     if (firstChrAry.size() == secondChrAry.size()) { 
      if (firstChrAry.equals(secondChrAry)) { 
      line += first.get(j); 
      checked.add(j); 
      } 
     } 
     } 
     if (!line.equals("")) 
     System.out.println(line); 
    } 

    } 
} 

加入我的输出结果在这里:

它坐

唯唯诺诺

谋杀DereDrum

确定

你好

朋友

+0

花了我一段时间来了解代码,但我现在明白了代码!我离我的东西很近,但离得很近。这已经为我清楚了。我不知道该怎么感谢你才足够。我几乎在思考,但这真的把私人列表的使用放在了角度。谢谢你,谢谢你,谢谢你。我现在非常接近完成的节目。 – 2013-03-14 07:09:48

+0

无论如何,我应该提出一些意见...干杯! – cwhsu 2013-03-14 07:25:02

2

重新使用here的anagram逻辑。

public boolean areAnagrams(String s1, String s2) { 
    //TODO : Strip punctuations from s1 and s2 
    char[] ch1 = s1.toCharArray(); 
    char[] ch2 = s2.toCharArray(); 
    Arrays.sort(ch1); 
    Arrays.sort(ch2); 
    return Arrays.equals(ch1,ch2); 
} 

通过迭代两个列表,并检查areAnagrams真,然后打印出来。

for (int i=0;i<size;i++) { 
    String first = firstList.get(i); 
    String second = secondList.get(i); 
    if (areAnagrams (first, second) { 
     System.out.println(first + " " + second); 
    }  
} 
+0

非常感谢。在这里的每个人的帮助下,我能够完成我的代码的这一部分。 – 2013-03-14 06:53:37

2

请尝试以下代码。

import java.util.ArrayList; 
import java.util.List; 

public class Client { 

    public static void main(String[] args) { 

     List<String> lst1 = new ArrayList<String>(); 
     List<String> lst2 = new ArrayList<String>(); 

     lst1.add("it's"); 
     lst1.add("Sit"); 
     lst1.add("yes-man"); 
     lst1.add("murdered"); 
     lst1.add("ok"); 
     lst1.add("DereDrum"); 
     lst1.add("Hello"); 
     lst1.add("Friend"); 

     lst2.add("its"); 
     lst2.add("sit"); 
     lst2.add("yesman"); 
     lst2.add("murdered"); 
     lst2.add("ok"); 
     lst2.add("deredrum"); 
     lst2.add("hello"); 
     lst2.add("friend"); 

     for (int i = 0; i < lst2.size(); i++) { 
      String original = lst2.get(i); 
      StringBuffer buff = new StringBuffer(original); 
      buff.reverse(); 
      if (lst2.contains(buff.toString())) { 
       System.out.println(lst1.get(i) + " " 
         + lst1.get(lst2.indexOf(buff.toString()))); 
       lst1.remove(lst2.indexOf(buff.toString())); 
       lst2.remove(buff.toString()); 
      } else { 
       System.out.println(lst1.get(i)); 
      } 

     } 

    } 

} 

并且输出将是。

it's 
Sit 
yes-man 
murdered DereDrum 
ok 
Hello 
Friend 

您可以通过单击下面的链接运行和检查。

Example Java Online Running Fiddle

+0

唯一的事情是,这不承认它是坐着成为anagrams,但他们是。 – 2013-03-14 06:37:21

+0

“它”和“坐”不是字谜。 '它'的字谜是'sti' – 2013-03-14 07:11:28

+0

字谜不是逆转的字。 anagram是一个字母数量相同的单词,它们都具有相同数量的字母。 – 2013-03-14 07:49:46