如何检查arraylist中的数组是不是包含某个值?

Posted

技术标签:

【中文标题】如何检查arraylist中的数组是不是包含某个值?【英文标题】:How to check if an array in an arraylist contains a certain value?如何检查arraylist中的数组是否包含某个值? 【发布时间】:2014-12-03 01:15:04 【问题描述】:

我有一个数组列表,其中包含字符串类型的数组。我创建数组列表并使用以下代码向其中添加数组:

List<String[]> transaction = new ArrayList<String[]>();

String[] transactionLine = new String[7];
transactionLine[0] = "0";
transactionLine[1] = "1";
//.....
transactionLine[6] = "some value";

transactionLines.add(transactionLine);

现在我想测试其中一个数组是否包含某个值。我这样尝试过,但随后它检查的是数组而不是数组的元素:

if(transactionLines.contains("some value"))  
     //Do some stuff with it

我知道这不起作用,但我现在不知道该怎么做。我已经在 *** 上找不到任何帖子(无论如何都没有针对这个问题的逻辑搜索词)。

注意:我在 arraylist 中选择了这种数组结构,因为我有固定数量的列(如 how to create dynamic two dimensional array in java? 中所建议的那样)。

非常感谢任何帮助!

【问题讨论】:

我认为您的方法不正确。你需要按照@assylias 的建议进行更改 直接的方法是在你的类中编写一个静态的contains 方法并执行arrayContains(transactionLines, "some value") 【参考方案1】:

@assylias 建议使用面向对象的方式很好,但他的示例没有说明列表是否包含一个属性具有特定值的事务。这个例子是:

public class Test 

    public static void main(final String[] args) 
        final List<TransactionLine> transaction = new ArrayList<>();

        transaction.add(new TransactionLine(1, "some value"));
        transaction.add(new TransactionLine(2, "another value"));
        transaction.add(new TransactionLine(3, "yet another value"));

        System.out.println(containsName(transaction, "some value"));
        System.out.println(containsName(transaction, "non-existent value"));
    

    // Iterates over all transactions until a transaction is found that has the
    // same name as specified in search
    private static boolean containsName(final List<TransactionLine> transaction, final String search) 
        for (final TransactionLine transactionLine : transaction) 
            if (transactionLine.getName().equals(search)) 
                return true;
            
        

        return false;
    

    private static class TransactionLine 

        private int id;

        private String name;

        public TransactionLine(final int id, final String name) 
            this.id = id;
            this.name = name;
        

        public int getId() 
            return id;
        

        public void setId(final int id) 
            this.id = id;
        

        public String getName() 
            return name;
        

        public void setName(final String name) 
            this.name = name;
        

    


这是一个包含两个类(TransactionTransactionLine)的示例:

测试:

public class Test 

    public static void main(final String[] args) throws Exception 
        final Transaction transaction = new Transaction();

        transaction.add("some name");
        transaction.add("another name");
        transaction.add("yet another name");

        System.out.println(transaction.containsName("some name"));
        System.out.println(transaction.containsName("non-existent name"));
    


交易:

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

public class Transaction 

    private final List<TransactionLine> transactionLines = new ArrayList<>();

    public void add(final String name) 
        final TransactionLine tl = new TransactionLine(transactionLines.size(), name);

        transactionLines.add(tl);
    

    public boolean containsName(final String name) 
        for (final TransactionLine transactionLine : transactionLines) 
            if (transactionLine.getName().equals(name)) 
                return true;
            
        

        return false;
    


交易行:

public class TransactionLine 

    private int id;

    private String name;

    public TransactionLine() 
    

    public TransactionLine(final int id, final String name) 
        this.id = id;
        this.name = name;
    

    public int getId() 
        return id;
    

    public void setId(final int id) 
        this.id = id;
    

    public String getName() 
        return name;
    

    public void setName(final String name) 
        this.name = name;
    


【讨论】:

感谢您的回答。您已经创建了一个类 Transaction,但是您能否使用我命名的变量名称?如果我必须创建一个类 Transaction 或 TransactionLine,现在对我来说很困惑。 (一个事务由多个事务行组成)。 那么只需将类命名为TransactionLine 和列表transaction。但是最好将列表再次包装在一个名为Transaction 的对象中。然后你可以实现方法containsName()作为这个新类的实例方法。 好的,谢谢。我将能够创建这个。感谢大家对 Java 新手的帮助。【参考方案2】:

解决问题的面向对象的方法是创建一个类:

class Transaction 
    private final int id;
    private final String name;
    //etc.

然后,如果您需要测试给定事务是否在列表中,您可以在该类中实现 equalshashcode,这将使您能够调用:

if(transactionLines.contains(someTransaction))  ... 

如果您只需要查找具有特定特征的交易,则需要遍历列表并检查每笔交易,例如:

Transaction result = null;
for (Transaction t : transacionLines) 
  if(t.getName().equals("some value") 
    result = t;
    break;
  

【讨论】:

这将检查列表是否包含整个事务。但是他想知道列表中是否包含一个成员具有一定价值的交易。 @assylias 感谢您的回答,非常感谢。我想以面向对象的方式来做,但我不知道“实现等于和哈希码”是什么意思。是否可以提供更详细的代码示例或一些可以帮助解决此问题的资源?提前致谢!【参考方案3】:
public static boolean isListOfStringArraysContainsString(List<String[]> arrayList, String s) 
    for (String[] arr : arrayList) 
        for (String string : arr) 
            if ((string != null) && (string.equals(s))) 
                return true;
            
        
    
    return false;

提供的代码完全符合您的要求,但@assylias 提供的解决方案是正确的

【讨论】:

感谢您的回答!我会尝试,但如果你也说最好是面向对象的方式,我会的。【参考方案4】:

我明白你的意思。通过使用 ArrayList 您正在尝试创建另一个字符串数组的数组。但是您犯了一个简单的错误。这就是您尝试在 ArrayList 中的数组中检索字符串的方式:

if(transactionLines.contains("some value"))  
     //Do some stuff with it

这个“一些值”是字符串数组“transactionLine”中存在的字符串,而不是列表“transactionLines”(指的是 ArrayList 对象)引用的字符串。 相反,这是你应该做的:

List<String[]> transactionLines = new ArrayList<String[]>();
		
		String[] transactionLine = new String[7];
		transactionLine[0] = "0";
		transactionLine[1] = "1";
		transactionLine[2] = "something";
		transactionLine[3] = "3";
		transactionLine[4] = "4";
		
		transactionLines.add(transactionLine);
		
		String[] mySL=transactionLines.get(0);
		
		System.out.println(mySL[2]);
		if (mySL[2].equals("something")) 
			//some code
		 else 
			//some code
		

希望这会有所帮助。

【讨论】:

以上是关于如何检查arraylist中的数组是不是包含某个值?的主要内容,如果未能解决你的问题,请参考以下文章

JQuery如何判断值中是不是包含某个值?

检查数组是不是包含某个对象

如何检查字符串是不是包含字母表中的所有字母? [复制]

如何检查数组字段是不是包含唯一值或 MongoDB 中的另一个数组?

Waterline ORM - 检查数组属性是不是包含值

Flutter & Firebase:如何检查某个项目是不是存在于 Firebase 文档中的数组中