2015-05-28 13 views
5

有什麼辦法可以縮短這個if()陳述嗎?爲了避免重複string.equals()如果()用string.equals方法縮短

if (extension.equals("jpg") || extension.equals("JPG") || extension.equals("png") || extension.equals("PNG") || extension.equals("bmp") || extension.equals("BMP") || extension.equals("jpeg") || extension.equals("JPEG")) 
{ 
    tmp.setIcon(new ImageIcon(getClass().getResource("/menage/Resources/imageIco.png"))); 
} 

要尋找的東西與此類似:

if (extension.equals(("jpg")||("JPG")||("png")||("PNG")||("bmp")||("BMP")||("jpeg")||("JPEG"))) 
{ 
    tmp.setIcon(new ImageIcon(getClass().getResource("/menage/Resources/imageIco.png"));) 
} 

我知道,這個問題看起來很奇怪,但if()用這麼長的條件清單尚不清楚,需要很多寫爲好。

+0

你可以嘗試將不同的選項打包到List中,並通過List#contains檢查它。 switch語句也可能會縮短一點。 – Dragondraikk

+0

您可以使用開關代替 – Ashwani

+0

您使用的是Java 8嗎? –

回答

5

首先將equals(...)更改爲equalsIgnoreCase(...)

其他選項,打造一個小寫的字符串(或者如果需要大寫字母)的一個HashSet與圖像擴展和看它是否包含你感興趣的字符串,改爲小寫:

if (imageExtSet.contains(myExtension.toLowerCase()) { 

} 
+0

你可以使用一個常量集合。 'public static final列表 VALID_IMAGE_EXTENSIONS = Arrays.asList(「JPG」,「GIF」,「PNG」);' – Matt

+1

@Matt'Set '將比'List '執行更好。這是處理這些案件的方法。可悲的是,似乎人們更喜歡天真地使用'List'或數組作爲job = \。 –

0

有一件事你可以做些什麼來消除一些檢查,到字符串爲小寫轉換:

String ext = extension.toLowerCase(); 

現在你有縮短聲明:

if (ext.equals("jpg") || ext.equals("png") || ext.equals("bmp") || ext.equals("jpeg")) 
+0

如果'ext'爲'null',這會非常糟糕。 –

+0

偉大的,指出。下一次你的代碼打破了,我知道你會說*沒有被問到,所以我沒有這樣做:) :) –

+1

這很容易解決:「jpg」.equals(分機) –

3

您可以將所有值保留在列表中,然後詢問是否包含。如果它只是一個襯墊(你不必問其他地方這種情況下),你可以這樣做:

if (Arrays.asList("jpg", "JPG", "png", "PNG", "bmp", "BMP", "jpeg", "JPEG").contains(extension)) 

當然你可以將列表保存爲一個對象,然後你需要的地方問這個條件引用它。

+0

雖然這個方法有效,但最好使用一個'Set'來加速它(但是,誰計數毫秒,我想知道?)。 –

+1

你應該使用''extension.toLowerCase()*並保留所有小寫值的列表,所以你不必重複所有可能的殼體 – yurib

2

使用HashSet的 喜歡這個

Set<String> extSet= new HashSet<String>(); 
// Add All in Lower case .. to save your efforts 

extSet.add("jpg"); 
extSet.add("png"); 

//...etc etc 

,只是檢查它是否存在於集

if(extSet.contains(extension==null?null:extension.toLowerCase())) 
{ 
/// True 
} 
else 
{ 
// False 
} 
+1

好的觸摸來檢查擴展是否爲空!你可以像這樣創建集合:'final Set ext = new HashSet <>(Arrays.asList(「png」,「jpg」));'。你可以使用下面的檢查:'if(extension!= null && extSet.contains(extension.toLowerCase()))',但這幾乎與你的代碼相同。 –

4

這裏是短版與預定義圖像類型:

Set<String> imgTypes = new HashSet<>() {{ 
    add("jpg"); add("JPG"); 
    add("png"); add("PNG"); 
    add("bmp"); add("BMP"); 
    add("jpeg"); add("JPEG"); 
}}; 

public boolean isImgType(String type) { 
    return imgTypes.contains(type); 
} 
0
if (Arrays.asList("jpg", "jpeg", "png", "bmp").contains(extension.toLowerCase)) 
0

添加在一些方法...

private static boolean isJpeg(String ext) { 
    return java.util.Arrays.asList("jpg", "jpeg").contains(ext.toLowerCase()); 
} 

private static boolean isPng(String ext) { 
    return "png".equalsIgnoreCase(ext); 
} 

private static boolean isBmp(String ext) { 
    return "bmp".equalsIgnoreCase(ext); 
} 

,並更改爲...

else if (isJpeg(extension) || isPng(extension) || isBmp(extension)) 
      { 
       tmp.setIcon(new ImageIcon(getClass().getResource("/menage/Resources/imageIco.png"))); 
      } 

isJpeg將拋出一個NullPointerException如果進一步擴展爲空,所以確保通過添加extension != null || ...它不是空或一些東西。


上面的是你的具體情況略有不同,因爲它允許JpEg和所有其他混合資本化漏網之魚。如果你不想這樣做,請使用這些。另外,如果擴展名爲null,則下面的附加優點是永不丟擲NullPointerException

private static boolean isJpeg(String ext) { 
    return java.util.Arrays.asList("jpg", "JPG", "jpeg", "JPEG").contains(ext); 
} 

private static boolean isPng(String ext) { 
    return java.util.Arrays.asList("png", "PNG").contains(ext); 
} 

private static boolean isBmp(String ext) { 
    return java.util.Arrays.asList("bmp", "BMP").contains(ext); 
} 
0

其他答案給出了很多很好的底層思路,但是這裏的基本原則是防止代碼重用。

如果你正在做這個測試不止一次,創建一個具有測試你的方法:

boolean isValidImageExtenstion(String extension) { 
    return (extension.equals("jpg") || extension.equals("JPG") || 
      extension.equals("png") || extension.equals("PNG") || 
      extension.equals("bmp") || extension.equals("BMP") || 
      extension.equals("jpeg") || extension.equals("JPEG")); 
} 

呼叫當您需要它的方法。如果你喜歡,你可以使用方法中其他答案中描述的方法之一(並且「忽略大小寫」的建議當然值得),但是現在你已經防止了代碼的重複,其餘部分變得不那麼重要。作爲獎勵,如果您決定要支持gif擴展,您只需在一個地方進行更改。

這種方法比其他方法的優點是它是自我記錄。這種方法很明顯,其他一些答案很模糊。

如果您只是這樣做了一次,而不打算再次這樣做,那麼您已經創建了工作代碼,所以不會浪費您的時間修改工作代碼

+0

我認爲值得重構工作代碼以提高可讀性。 OP的具體例子可能是好的,但是'if'語句可能匆匆無法讀取。如果代碼可讀,則更容易檢查下一個人何時進入。 –