在读取打印条件时打印 ArrayList
Posted
技术标签:
【中文标题】在读取打印条件时打印 ArrayList【英文标题】:Printing an ArrayList while reading it for print conditions 【发布时间】:2013-03-02 07:48:07 【问题描述】:我有两个ArrayList<String>
s。一个包含带有标点和大写的单词,另一个则删除了这些。
列表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(words) 的大小并打印它正在查看的单词。然后我使用我的 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
我尝试使用地图,以便在单词本身在第二个列表中按字母顺序排序后,我可以按字母顺序对单词进行排序。这具有大致相同的输出。
【问题讨论】:
对于字谜检查,不要使用递归。将每个字符串复制到char[]
,sort 数组,然后进行简单的字符串比较。显然,首先检查是否相等。
@Jim Garrison 如果我这样做,第一个 ArrayList 不会与第二个 ArrayList 一起排序。由于我试图打印第一个的结果,就好像它们像第二个一样完成,所以我不确定这是否可行。
【参考方案1】:
重用来自here的字谜逻辑。
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
true,然后打印出来。
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);
【讨论】:
非常感谢。在大家的帮助下,我得以完成这部分代码。【参考方案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
【讨论】:
唯一的问题是这不承认它是字谜,但它们是。its
和 sit
不是字谜。 its
的字谜是 sti
字谜不是颠倒的词。字谜是一个单词,其中包含相同数量的字母,并且它们都共享相同数量的字母。【参考方案3】:
再做一次……其他人已经告诉你关键点了。 放入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
好的
你好
朋友
【讨论】:
花了我一段时间来理解代码,但我现在理解了代码!我与我所拥有的东西相距甚远,却又如此接近。这对我来说非常清楚。我不知道该怎么感谢你才足够。我几乎是束手无策,但这确实使私人名单之类的东西的使用成为现实。谢谢你,谢谢你,谢谢你。我现在非常接近完成的程序。以上是关于在读取打印条件时打印 ArrayList的主要内容,如果未能解决你的问题,请参考以下文章