![](/img/trans.png)
[英]How to check if ArrayList<ArrayList<String>> contains a certain ArrayList<String>
[英]how to check if arraylist contains a string
我有這個代碼,找到女性藝術家,男性藝術家或樂隊的數量 -
import java.util.*;
public class FindGender {
public static void main(String[] args) {
// TODO code application logic here
ArrayList < String > artists = new ArrayList < > ();
int mnum = 0, fnum = 0, bnum = 0;
artists.add("Beyonce (f)");
artists.add("Drake (m)");
artists.add("Madonna (f)");
artists.add("Michael Jackson (m)");
artists.add("Porcupine Tree (b)");
artists.add("Opeth (b)");
artists.add("FallOut Boy (b)");
artists.add("Rick Ross {m}");
artists.add("Chris Brown (m)");
if (artists.contains("(b)")) bnum++;
if (artists.contains("(m)")) mnum++;
if (artists.contains("(f)")) fnum++;
System.out.println("The number of male artists is: " + mnum);
System.out.println("The number of female artists is: " + fnum);
System.out.println("The number of bands is: " + bnum);
}
}
但輸出顯示 - 運行:
The number of male artists is: 0
The number of female artists is: 0
The number of bands is: 0
BUILD SUCCESSFUL (total time: 0 seconds)
任何幫助,將不勝感激
包含和包含String的一部分是不同的。 為了返回true,它應該匹配整個String。
這有效
for (String item : artists) {
if (item.contains("(b)")) bnum++;
if (item.contains("(m)")) mnum++;
if (item.contains("(f)")) fnum++;
}
list#contains()
比較list#contains()
的整個字符串而不是字符串的一部分,而不是你可以做的
if(artists.stream().anyMatch(e -> e.contains("(b)"))) // java 8 solution
即迭代列表並檢查包含列表元素。
你可以使用if(string.indexOf("(f)")!=-1) fnum++
。 這在您的代碼中看起來像這樣。
public static void main(String[] args)
{
// TODO code application logic here
ArrayList<String> artists = new ArrayList<>();
int mnum = 0, fnum = 0, bnum = 0;
artists.add("Beyonce (f)");
artists.add("Drake (m)");
artists.add("Madonna (f)");
artists.add("Michael Jackson (m)");
artists.add("Porcupine Tree (b)");
artists.add("Opeth (b)");
artists.add("FallOut Boy (b)");
artists.add("Rick Ross (m)");
artists.add("Chris Brown (m)");
for(String s:artists)
{
if(s.indexOf("(b)")!=-1) bnum++;
if(s.indexOf("(m)")!=-1) mnum++;
if(s.indexOf("(f)")!=-1) fnum++;
}
System.out.println("The number of male artists is: " + mnum);
System.out.println("The number of female artists is: " + fnum);
System.out.println("The number of bands is: " + bnum);
}
這可以通過Java 8流輕松完成:
long numberOfMaleArtists = artists.stream()
.filter(artist -> artist.contains(("(m)")))
.count();
這將創建artists
列表中的流,並僅過濾掉男性藝術家。 然后計算出現的次數。
優選地,這可以被重構為自己的方法,該方法將文本過濾為輸入。 然后,您可以按名稱或任何想要的方式過濾藝術家。
您在整個List上使用contains方法,您應該在每個元素上使用它。
在您的情況下,您可以for each
循環使用a,如下面的示例所示。
for(String artist : artists) {
if (artist.contains("(b)")) bnum++;
if (artist.contains("(m)")) mnum++;
if (artist.contains("(f)")) fnum++;
}
主要的問題是contains
-方法上ArrayList
將檢查的精確匹配String
,而不是一部分String
。 相反,必須使用String.contains
檢查List
每個String
。
如果您使用的是Java 8,則一種方法是將ArrayList
collect
到Map
並使用reduction來計算出現次數。 假設您創建了一個單獨的函數來檢查“類型” ,如下所示:
private static String artistType(final String artist) {
if (artist.contains("(b)")) {
return "band";
} else if (artist.contains("(m)")) {
return "male";
} else if (artist.contains("(f)")) {
return "female";
}
return "unknown";
}
它使用contains -method來確定藝術家的類型。
然后,您可以使用收集器和縮減的組合來計算所有出現次數 。
Map<String, Integer> countByType = artists.stream()
.collect(Collectors.groupingBy(
FindGender::artistType,
Collectors.reducing(0, i -> 1, Integer::sum)));
生成的地圖將包含鍵帶 , 男性和女性 - 值將是3,4,2,如OPs示例中所示。
完整示例如下所示:
public class FindGender {
public static void main(String[] args) {
List<String> artists = new ArrayList<>();
artists.add("Beyonce (f)");
artists.add("Drake (m)");
artists.add("Madonna (f)");
artists.add("Michael Jackson (m)");
artists.add("Porcupine Tree (b)");
artists.add("Opeth (b)");
artists.add("FallOut Boy (b)");
artists.add("Rick Ross (m)");
artists.add("Chris Brown (m)");
Map<String, Integer> countByType = artists.stream()
.collect(Collectors.groupingBy(
FindGender::artistType,
Collectors.reducing(0, i -> 1, Integer::sum)));
System.out.println("Map: " + countByType);
}
private static String artistType(final String artist) {
if (artist.contains("(b)")) {
return "band";
} else if (artist.contains("(m)")) {
return "male";
} else if (artist.contains("(f)")) {
return "female";
}
return "unknown";
}
}
輸出為: Map: {band=3, female=2, male=4}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.