Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检查列表是否正确的最佳方法<;字符串[]>;包含字符串[]_Java_Arrays_String_Collections - Fatal编程技术网

Java 检查列表是否正确的最佳方法<;字符串[]>;包含字符串[]

Java 检查列表是否正确的最佳方法<;字符串[]>;包含字符串[],java,arrays,string,collections,Java,Arrays,String,Collections,我有一个列表声明为: List<String[]> arrayList = new ArrayList<>(); 有没有更好的方法来检查ArrayList是否包含特定的字符串[]?是目前最有效的方法。该方法仅用于此目的,并且优化程度与它在单个for循环的实现中一样低 试试看。我可能会寻找一种解决方案,不直接在列表中存储String[]对象。这可能意味着创建某种有意义的类,可以在内部存储字符串[],也可能意味着切换到ArrayList而不是arrays。但是,在不了解上下

我有一个
列表
声明为:

List<String[]> arrayList = new ArrayList<>();
有没有更好的方法来检查
ArrayList
是否包含特定的
字符串[]

是目前最有效的方法。该方法仅用于此目的,并且优化程度与它在单个
for
循环的实现中一样低


试试看。

我可能会寻找一种解决方案,不直接在列表中存储
String[]
对象。这可能意味着创建某种有意义的类,可以在内部存储
字符串[]
,也可能意味着切换到ArrayList而不是arrays。但是,在不了解上下文的情况下,我能建议的最好方法是使用

ArrayList.contains
不会比您当前所做的更快,而且所有的
数组.asList
调用可能会非常冗长,但是
HashSet.contains
可能比您现在所做的要快得多。

被数组列表打破,所以为什么不使用列表列表列表呢

您可以轻松地使用将数组转换为列表

String[]数组=新字符串[2];
数组[0]=“item1”;
数组[1]=“item2”;
List arrayList=新建arrayList();
add(Arrays.asList(array));

我同意Rod_Algonquin的答案,但还有另一种方法。只需编写自己的类包装数组,并实现一个自定义equals和hashCode方法,让它们返回array.equals()和array.hashCode()。使用这种方法,您可以将对象存储在列表中,并直接对列表进行包含检查

List<ArrayWrapper> list = new ArrayList<ArrayWrapper>();
list.add(new ArrayWrapper(new String[]{"test", "123"}));
list.add(new ArrayWrapper(new String[]{"abc", "def"}));
list.add(new ArrayWrapper(new String[]{"789", "cgf"}));

String[] arrayToSearchFor = {"test", "123"};
ArrayWrapper wrapperToSearchFor = new ArrayWrapper(arrayToSearchFor);
System.out.println(list.contains(wrapperToSearchFor));

String[] arrayToSearchFor2 = {"hello", "123"};
ArrayWrapper wrapperToSearchFor2 = new ArrayWrapper(arrayToSearchFor2);
System.out.println(list.contains(wrapperToSearchFor2));


class ArrayWrapper
{
    private String[] array;

    public ArrayWrapper(String[] array)
    {
        this.array = array;
    }

    public String[] getArray()
    {
        return array;
    }

    @Override
    public int hashCode()
    {
        return Arrays.hashCode(array);
    }

    @Override
    public boolean equals(Object obj)
    {
        if (!(obj instanceof ArrayWrapper))
        {
            return false;
        }

        return Arrays.equals(array, ((ArrayWrapper) obj).getArray());
    }
}

看起来不错。当前的方法有什么问题?
arrayList.contains(myStringArray)
@bigdestropher这不起作用。我同意@sᴜʀᴇsʜᴀᴛᴛᴀ - 如果(!Arrays.equals())确实要对equals求反吗?这是真的,因为您将相同的引用传递给了添加的字符串数组。尝试使用相同内容的
array
Yes创建一个新数组,并传递另一个具有相同元素的数组实例将返回
false
(但也应返回
true
)!在我看来,这不是一个回应,它不会给当前的帖子增加任何价值。如果你把它作为评论添加到这个问题上就足够了…@user503413-1??当OP问我最好的方法时,我只是说现在的方法是最好的方法。这就像是一个“是/或”的问题。好主意,但如果你用
集合
而不是
列表
,让
ArrayRapper
缓存它的
hashCode
,不是更好吗?@Yogu取决于OP的需要。他说他有一个列表,所以他可能需要按索引获取元素。缓存哈希代码只有在数组从未被修改的情况下才会起作用。
// Make a List that uses the provided array for its contents:
List<String> stringList = Arrays.asList(stringArray);
Set<List<String>> stringLists = new HashSet<>();

// when you want to add a String[]:
stringLists.add(Arrays.asList(stringArray));

// when you want to check whether a String[] is in the set:
stringLists.contains(Arrays.asList(stringArray));
String[] array = new String[2];
array[0] = "item1";
array[1] = "item2";
List<List<String>> arrayList = new ArrayList<List<String>>();
arrayList.add(Arrays.asList(array));
List<ArrayWrapper> list = new ArrayList<ArrayWrapper>();
list.add(new ArrayWrapper(new String[]{"test", "123"}));
list.add(new ArrayWrapper(new String[]{"abc", "def"}));
list.add(new ArrayWrapper(new String[]{"789", "cgf"}));

String[] arrayToSearchFor = {"test", "123"};
ArrayWrapper wrapperToSearchFor = new ArrayWrapper(arrayToSearchFor);
System.out.println(list.contains(wrapperToSearchFor));

String[] arrayToSearchFor2 = {"hello", "123"};
ArrayWrapper wrapperToSearchFor2 = new ArrayWrapper(arrayToSearchFor2);
System.out.println(list.contains(wrapperToSearchFor2));


class ArrayWrapper
{
    private String[] array;

    public ArrayWrapper(String[] array)
    {
        this.array = array;
    }

    public String[] getArray()
    {
        return array;
    }

    @Override
    public int hashCode()
    {
        return Arrays.hashCode(array);
    }

    @Override
    public boolean equals(Object obj)
    {
        if (!(obj instanceof ArrayWrapper))
        {
            return false;
        }

        return Arrays.equals(array, ((ArrayWrapper) obj).getArray());
    }
}
true
false