2012-07-19 81 views
0

我想知道知道集合的所有值是否與特定值匹配的最佳方法。檢查集合是否包含與特定值匹配的所有值

List<Integer> listOfStrings = new ArrayList<Integer>(); 

所有我想知道的是,如果「listOfStrings」中的所有條目匹配一個特定的值;例如沒有不是'1'的整數。

我需要最快的解決方案。我有一個解決方案,但它是非常基本的。

+1

爲什麼你有一個名爲listofStrings的變量,它實際上是整數列表? – dcp 2012-07-19 20:42:04

+1

我會先將'listOfStrings'重命名爲'整數'。好的命名是編程中最重要的事情之一,並命名一個整數列表「listOfStrings」是一個非常糟糕的主意。 – 2012-07-19 20:43:10

+0

你的'基本'方法是什麼?當你說'最快'時,你的意思是說效率還是什麼? – 2012-07-19 20:59:35

回答

1

你可以用簡單的for循環迭代你的列表,並將每個值與你的特定值(比如1)進行比較。如果列表中的一個值不等於某個值,只需將布爾值設置爲false即可。

+0

附加說明:如果某個值與期望值不相等,則應將布爾值設置爲false並中斷循環。 – jrad 2012-07-19 20:49:56

4

遍歷它:

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; 
} 
+0

如果列表的任何值爲null,則會失敗...拋出新的NullPointerException()。 – poussma 2012-07-20 06:52:55

-2

使用.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.

+3

這實際上並沒有回答他的(錯誤的措詞)問題。 – 2012-07-19 20:43:33

+0

你懂什麼? (它仍然比循環for循環更好...) – poussma 2012-07-19 20:46:23

+0

這將告訴他列表中是否有某個值,但如果列表中的所有值都是這樣,則不會。 – 2012-07-19 20:47:00

1

只是這樣做

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; 
} 
+0

-1。甚至不編譯。你正在比較int與STring。 – 2012-07-19 21:00:51

+3

你知道JB有些人把時間花在他們的日常工作上,從移動設備(iphones)等發佈,他們不能編譯和完全檢查語法錯誤。並在以後作出修改 – 2012-07-19 21:12:39

+0

錯誤,是的,那又如何?我每天花很多時間在沒有編譯的情況下發布,如果我的回答顯然是錯誤的,我覺得得到一個downvote是正常的。如果答案得到解決,我會很高興地取消我的投票。你不需要一個編譯器就可以知道你不能比較一個STring和一個int。如果你需要一個,爲什麼在沒有編譯器的情況下回答? – 2012-07-19 21:16:12

0
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); 
+0

良好的捕獲,固定雖然我不知道break語句退出循環。我不認爲這是最明智的做法 – 2012-07-19 21:31:06

+0

沒關係,但最好的方法是將循環提取到方法中,並從方法返回。您也可以將'&&!x'添加到循環的停止條件中。而且它會更清晰,如果if(!listOfInts.get(i).equals(target)){x = false;}':它不需要一個空的if塊,後面跟着一個else。 – 2012-07-19 21:35:31

+0

謝謝,我不知道如果!在前線工作,所以我只是按照我知道的方式製作.equals會起作用 – 2012-07-19 21:43:12

-1

令我驚訝的是,所有的解決方案提出至今都只是簡單的錯誤,或者包含一個微妙的錯誤,或者可以更高效。

這裏有一個工作快無論何種類型列表的是一個解決方案,即使列表中包含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; 
} 
1

在Java 8,你可以使用流的allMatch方法來實現這一目標。

public boolean allOnes(Collection<Integer> values) { 
    return values.parallelStream().allMatch(i -> i == 1); 
} 

如果有多個處理器可用,使用parallelStream可能會產生更好的性能。

相關問題