2011-11-13 21 views
0
public boolean setValidColor(String input, String colors) { 
    int exists; 
    isValidColor = true; 
    char[] colorch = colors.toCharArray(); 
    Arrays.sort(colorch); 
    for(int i = 0; i < input.length(); i++) 
    { 
     exists = Arrays.binarySearch(colorch, input.charAt(i)); 
     if(exists == -1) 
     { 
      isValidColor = false; 
      break; 
     } 
    } 
    return isValidColor; 
} 

我在比較不同長度的兩個字符串和在僅有1的無效輸入的實例返回false麻煩..如何比較兩個不同長度的字符串,並僅爲1個無效字符返回false?

例如: 可能的顏色是RGOPYB和輸入顏色YZOR。 'Z'是不可能的,我需要編碼返回false,但代碼不斷返回true。我哪裏錯了?

編輯:這個代碼比這個更多(做OOP),這只是一個我不斷遇到麻煩的方法。

+0

你能改寫這是......什麼是有意義?你把'String'與'String.equals()'進行比較......看起來你正在嘗試做一些與之完全不同的事情。 –

+1

你過於複雜...... –

+0

我相信他正在像字符集那樣對待字符串,所以順序無關緊要。 – MeBigFatGuy

回答

6

Arrays.binarySearch只會在位置0處插入搜索的值時返回-1。對於未找到的其他值,將返回其他負值。測試exist < 0而不是exists == -1

+0

所以我試圖做到這一點。我沒有提到這一點,但還有更多需要滿足的條件。對於我正在做的事情,我從可能的列表中生成了一個隨機的4字母字符,並且我的輸入必須是可能的字符,並且如果匹配4個字母列表就會變爲真。假設我必須將我的輸入BORG與BORG進行比較,並確保列表中包含有效的字符。它應該成爲真實的,但它不斷返回假。 – user1043911

+0

如果你只處理四個字母的測試,那麼二分查找是過量的。 (int i = input.length() - 1; i> = 0; --i)if(colors.indexOf(input.charAt(i))== -1)返回false;返回true;' –

0

來自於java.util.Arrays: 搜索關鍵字的索引,如果它包含在數組中;否則,( - (插入點)-1)。 意味着你的條件應該是:

if(exists < 0) 
0

我認爲泰德·霍普發現你的問題。


我只是想指出的是,當前的做法(排序和使用二進制搜索)很可能是比使用colors.indexOf(input.charAt(i))簡單O(N^2)算法顯著慢。您可以通過「提升」創建排序後的字符數組來改進內容。 (或者,也許只是要求將colors字符串作爲先決條件排序。)但即使進行了這種更改,如果顏色數組足夠小,indexOf方法仍然會更快。

這樣做的道理在於,如果不包含預期數據的真實特徵,優化(特別是過早優化)會使事情變得更糟。

(現在也許「RGOPYB」並不表示顏色的實際數量,但如果是這樣的話,你應該告訴我們......)

0

您可能需要將其轉換成列表。然後,您可以使用retainAll或removeAll並查看列表是否爲空/相同。

喜歡的東西:

List validInput= input.retainAll(colors); 
if(validInput.equals(input)) { 
return true; 
} 
return false; 
相關問題