这是我的第一篇文章。我花了好几个小时试图弄清楚如何将我的字符串word
与我的所有ArrayList
元素进行比较,检查它们是否相等,无视大小写。
这是我的代码。
private static void writeFile(Scanner scanWords, ArrayList<String> wordList,
FileWriter fo, BufferedWriter out) throws IOException {
String word = null;
int count = 0;
boolean contains=false;
String temp = "";
for(int i = 0; i<wordList.size();i++){
while(scanWords.hasNext()){
word= scanWords.next();
if(wordList.get(i).equalsIgnoreCase(word)){
contains = true;
}else{
System.out.println(word);
out.write(word);
//out.write(word);
}
}
}
count++;
out.close();
}
给予的任何帮助都会很棒。
答案 0 :(得分:3)
首先,将您的List<String>
转换为HashSet
不区分大小写的字符串 - 即全部小写(使用String.toLowerCase()
方法)。然后,您可以使用Collection.contains()
方法
e.g。
List<String> strings;
Set<String> lowerCaseStrings = new HashSet<String>(strings.size());
for (String str : strings){
lowerCaseStrings.add(str.toLowerCase());
}
boolean match = lowerCaseString.contains(myStr.toLowerCase());
编辑:建议使用ArrayList<String>
,但应该是HashSet<String>
- 请参阅以下评论。
答案 1 :(得分:1)
问题来自于你试图以错误的顺序用同样的方法做三件不同的事情:
这些操作中的每一个都应该是一个独立的操作。关于你的要求:
我如何将我的String ie word与我的所有ArrayList元素进行比较, 检查它们是否相等,无视案例
这是完整程序的一部分,应该采用自己的方法(上面列表中的第二个项目符号)。您不需要Scanner,FileWriter和BufferedWriter。你需要的只是单词和列表。该方法应该返回一个布尔值:
public boolean listContainsWordIgnoringCase(List<String> list, String word) {
实施非常简单:
public boolean listContainsWordIgnoringCase(List<String> list, String word) {
for (String element : list) {
if (word.equalsIgnoreCase(element)) {
// no need to continue looping. We've found the answer
return true;
}
}
// we've looped through all the elements without finding a match
return false;
}
现在可以在您的程序中使用此方法。
诀窍是将逻辑分成只有一个责任的简单块。并为每个块创建一个方法。
答案 2 :(得分:0)
我如何将我的字符串
word
与我的所有ArrayList
元素进行比较......
看来,您正在错误地使用scanWords
扫描程序对象。
使用您的代码,如果wordsList
的第一个元素与任何scanWords
元素不匹配,则wordsList
中的所有元素都不会被处理以进行比较。为什么,因为要与列表中的第一个单词进行比较,您已经迭代到scanWords
的末尾,导致下一次调用hasNext()
始终返回false
。
以下是对您的要求的修复:
while ( scanWords.hasNext() ) {
word= scanWords.next();
//for( int i = 0; i < wordList.size(); i++ ) {
for( String wordInList : wordList ) {
if( wordInList.equalsIgnoreCase( word ) ) {
contains = true;
} else {
System.out.println( word );
out.write( word );
}
} // for list
} // while scanner
解决方案2 :
之前我尝试过这个方法,问题是它循环使用相同的单词6次。 6是我的arraylist的大小。
这是一个没有显式循环列表元素的简单解决方案。
String listElements = wordList.toString().toLowerCase();
while ( scanWords.hasNext() ) {
word = scanWords.next();
if ( listElements.contains( word.toLowerCase() ) ) {
contains = true;
} else {
System.out.println( word );
out.write( word );
}
} // while scanner
示例执行 :
List<String> ls = new ArrayList<String>( 4 );
ls.add( "raVi" );
ls.add( "sreekaR" );
ls.add( "lakShMi" );
ls.add( "sumAna" );
String listElements = ls.toString();
System.out.println( "listElements: " + listElements );
System.out.println( "listElements.toLowerCase(): " + listElements.toLowerCase() );
scanner = new Scanner( "Ravi Sumana Others sREEKar LAKshmi" );
while( scanner.hasNext() ) {
String w1 = scanner.next();
System.out.println( "'" + w1 + "' is in list ? = " + listElements.toLowerCase().contains( w1.toLowerCase() ) );
}
执行结果是:
listElements: [raVi, sreekaR, lakShMi, sumAna]
listElements.toLowerCase(): [ravi, sreekar, lakshmi, sumana]
'Ravi' is in list ? = true
'Sumana' is in list ? = true
'Others' is in list ? = false
'sREEKar' is in list ? = true
'LAKshmi' is in list ? = true