繁体   English   中英

如何检查arraylist是否包含字符串

[英]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 collectMap并使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM