我想知道知道集合的所有值是否與特定值匹配的最佳方法。檢查集合是否包含與特定值匹配的所有值
List<Integer> listOfStrings = new ArrayList<Integer>();
所有我想知道的是,如果「listOfStrings」中的所有條目匹配一個特定的值;例如沒有不是'1'的整數。
我需要最快的解決方案。我有一個解決方案,但它是非常基本的。
我想知道知道集合的所有值是否與特定值匹配的最佳方法。檢查集合是否包含與特定值匹配的所有值
List<Integer> listOfStrings = new ArrayList<Integer>();
所有我想知道的是,如果「listOfStrings」中的所有條目匹配一個特定的值;例如沒有不是'1'的整數。
我需要最快的解決方案。我有一個解決方案,但它是非常基本的。
你可以用簡單的for
循環迭代你的列表,並將每個值與你的特定值(比如1)進行比較。如果列表中的一個值不等於某個值,只需將布爾值設置爲false即可。
附加說明:如果某個值與期望值不相等,則應將布爾值設置爲false並中斷循環。 – jrad 2012-07-19 20:49:56
遍歷它:
public boolean checkAll(ArrayList<String> list) {
for(int i = 0; i < listOfStrings.size(); i++) {
String candidate = listOfStrings.get(i);
if(candidate == null || !candidate.equals("1")) {
return false;
}
}
return true;
}
如果列表的任何值爲null,則會失敗...拋出新的NullPointerException()。 – poussma 2012-07-20 06:52:55
使用.contains()
方法,告訴你在列表中是否存在價值:http://docs.oracle.com/javase/1.4.2/docs/api/java/util/List.html#contains%28java.lang.Object%29
myList.contains(1);
注:它使用的包含對象的.equals()
方法(它可能對你未來的發展很有用)。
HIH M.
這實際上並沒有回答他的(錯誤的措詞)問題。 – 2012-07-19 20:43:33
你懂什麼? (它仍然比循環for循環更好...) – poussma 2012-07-19 20:46:23
這將告訴他列表中是否有某個值,但如果列表中的所有值都是這樣,則不會。 – 2012-07-19 20:47:00
只是這樣做
public boolean isFilled(String value, ArrayList<String> list)
{
for(int i = 0; i < list.size(); i++)
{
String toTest = list.get(i);
if(toTest == null || !toTest.equals(value)) {
return false;
}
}
return true;
}
-1。甚至不編譯。你正在比較int與STring。 – 2012-07-19 21:00:51
你知道JB有些人把時間花在他們的日常工作上,從移動設備(iphones)等發佈,他們不能編譯和完全檢查語法錯誤。並在以後作出修改 – 2012-07-19 21:12:39
錯誤,是的,那又如何?我每天花很多時間在沒有編譯的情況下發布,如果我的回答顯然是錯誤的,我覺得得到一個downvote是正常的。如果答案得到解決,我會很高興地取消我的投票。你不需要一個編譯器就可以知道你不能比較一個STring和一個int。如果你需要一個,爲什麼在沒有編譯器的情況下回答? – 2012-07-19 21:16:12
boolean x=true;
ArrayList<Integer> listOfInts = new ArrayList<Integer> (Arrays.asList(5,3,1,2,9,5,0,7));
Integer target = 1;
for (int i = 0; i < listOfInts.size(); i++)
{
if (listOfInts.get(i).equals(target)) // nothing
{
} else {
x = false;
break;// exits loop right after this
}
}
System.out.println(x);
良好的捕獲,固定雖然我不知道break語句退出循環。我不認爲這是最明智的做法 – 2012-07-19 21:31:06
沒關係,但最好的方法是將循環提取到方法中,並從方法返回。您也可以將'&&!x'添加到循環的停止條件中。而且它會更清晰,如果if(!listOfInts.get(i).equals(target)){x = false;}':它不需要一個空的if塊,後面跟着一個else。 – 2012-07-19 21:35:31
謝謝,我不知道如果!在前線工作,所以我只是按照我知道的方式製作.equals會起作用 – 2012-07-19 21:43:12
令我驚訝的是,所有的解決方案提出至今都只是簡單的錯誤,或者包含一個微妙的錯誤,或者可以更高效。
這裏有一個工作快無論何種類型列表的是一個解決方案,即使列表中包含null元素:
public boolean listIsFilledWith(List<Integer> integers, int i) {
Integer value = i; // transform the int into an Integer only once
for (Integer element : integers) { // iterate using an iterator, to avoid performance problems with linked lists
if (!value.equals(element)) { // value is not null, but element can be. Don't compare objects with == or !=
return false; // return early
}
}
return true;
}
在Java 8,你可以使用流的allMatch
方法來實現這一目標。
public boolean allOnes(Collection<Integer> values) {
return values.parallelStream().allMatch(i -> i == 1);
}
如果有多個處理器可用,使用parallelStream
可能會產生更好的性能。
爲什麼你有一個名爲listofStrings的變量,它實際上是整數列表? – dcp 2012-07-19 20:42:04
我會先將'listOfStrings'重命名爲'整數'。好的命名是編程中最重要的事情之一,並命名一個整數列表「listOfStrings」是一個非常糟糕的主意。 – 2012-07-19 20:43:10
你的'基本'方法是什麼?當你說'最快'時,你的意思是說效率還是什麼? – 2012-07-19 20:59:35