簡體   English   中英

如何查找包含Object的ArrayList

[英]How to find ArrayList containing Object

我有一個方法,我可以從中返回對象

public static Object login(DataManager dataManager, String userName, String password)       
    ArrayList<LoginCredentialsBean> loginCredentialsList = new ArrayList<LoginCredentialsBean>();       
    String authenticated = "false";     
    Connection connection = null;       
    try {           
        connection  = dataManager.getConnection();          
    } catch (Exception e) {         
         return ("Having problem in connectiong to databaste: " + e.getMessage());          
    }       
    if (connection != null) {           
         try {                                       
             ...                     
             try {                   
                 ResultSet rs = prepStatement.executeQuery();                   

                 try {                      
                     while (rs.next()) {
                         ...                             
                         loginCredentialsList.add(new LoginCredentialsBean(roleId, orgaCode, passwordExpiryDate, date, status, language));                                                          
                        authenticated = "true";                          
                     } //end of while()                                                  
                 } finally {                     
                     rs.close();                     
                 }                   
             } finally {
                 prepStatement.close();                  
             }                
             if (authenticated.equals("true")) {                     
                updateUserLogByInserting(connection, userName);                  
             }

         } catch(SQLException e) {               
             System.out.println("Could not login from dataabse:" + e.getMessage());              
         } finally {                 
             dataManager.putConnection(connection);                          
         }                  
    }       
    if (authenticated.equals("true")) {                 
        return loginCredentialsList;            
    } else {        
        return authenticated;           
    }       
} //end of login()

現在我正在測試它

public static void main(String... args) {

    MoneyTreeServices moneyTreeServices = new MoneyTreeServices();

    Object result = moneyTreeServices.login("Admin", "cbas1234");       
    if (result instanceof ArrayList<?>) {

        System.out.println("ArrayList instance");           
    }       
    System.out.println(result);
}

它返回我的結果

ArrayList instance
[pk.mazars.moneyTree.bean.LoginCredentialsBean@b7ec5d]

我想問我是否使用像ArrayList<?>這樣的條件。 我如何檢查包含LoginCredentialsBean對象的ArrayList。 就像我使用時一樣

if (result instanceof ArrayList<LoginCredentialsBean>) {

}

我得到錯誤

Can not perform instanceof check against parameterized type ArrayList<LoginCredentialsBean>. Use the form ArrayList<?>

我想檢查instanceof ArrayList,arraylist有LoginCredentialsBean嗎?

謝謝。

參數化類型信息在編譯時被擦除,而instanceof在(fanfare)運行時被解析 - 這就是你得到該錯誤的原因。

你可以做的是迭代List的元素和它們的instanceof

干杯,

簡短的回答是, 你做不到 泛型是通過類型擦除實現的 - 它們實際上是一個編譯時語法糖,以確保您不將Integer放入List<String>

但是,運行時對象本身只是原始類型。 ArrayList一個實例不知道它是一個ArrayList<String> (或者更確切地說,它被分配給具有該泛型類型的變量)。 因此,當您使用反射查詢它時,您無法獲得任何通用類型信息。

我能想到兩種廣泛的解決方案。 一種是迭代列表內容並檢查它們的動態類型 - 例如,如果第一個元素是LoginCredentialsBean ,那么假設你有一個List<LoginCredentialsBean>是合理的。 這不會對空列表的工作,雖然,這可能是一個問題,並有可能產生假陽性(如List<Object> allParameters可能恰好有一個LoginCredentialsBean作為它的第一個元素...)

另一種是顯式傳遞元數據對象 - 所以在這種情況下,你將從login方法返回Object ,以及描述它是什么類型的對象的標記。 這可能是一個簡單的枚舉常量; 或者轉到另一個極端,您可以使令牌通常鍵入,這樣編譯器可以根據您返回的類型檢查這一點,並確保令牌是類型正確的。

但無論如何, instanceof太少(信息),太晚了。


請注意,您的login方法看起來很奇怪。 我認為它根本不應該返回一個Object ,因為它只是懶惰而且完全顛覆了靜態類型系統,它可以幫助你。 相反,我認為它應該只返回一個List<LoginCredentialsBean>其中包含與給定登錄相關的憑據。

您有三個不同的路徑返回。 第一種是在連接到數據庫時遇到異常 - 在這種情況下,您應該拋出異常 返回帶有錯誤詳細信息的字符串非常不典型且令人困惑 - 異常條件應作為Exception處理,這就是它們的用途。

另外兩種情況是你能夠查找確定結果的情況。 對於失敗的登錄案例,我只返回一個空列表(即此用戶名/密碼沒有任何憑據),同時在成功登錄期間返回填充列表。

如果您非常希望能夠區分登錄失敗和成功登錄(沒有憑據),那么可能會返回復合對象,例如:

class LoginStatus {
    final boolean authenticated;
    final List<LoginCredentialsBean> credentials;
}

無論哪種方式,調用者確切地知道他們正在返回什么,並且可以適當地調用它上的方法而無需調用instanceof和typecast。

你必須檢查兩次。

if (result instanceof ArrayList<?>) {
 System.out.println("ArrayList instance");
 //cast
 ArrayList<LoginCredentialsBean> list = (ArrayList<LoginCredentialsBean>) result;

  ///..check if list contains LoginCredentialsBean
 for(int i=0; i<list.size(); i++){
  if(list.get(i) instanceof LoginCredentialsBean){
   System.out.println("LoginCredentialsBean instance");
  }  
 }
}     

沒有像“ArrayList包含LoginCredentialsBean”這樣的東西,ArrayList始終包含Objects。

你必須迭代列表並檢查每個對象:

for (Object o: result) {
     if (!(o instanceof LoginCredentialsBean)) {
           //Fail
     }
}

您可以使用contains(Object o)來檢查ArrayList是否包含您的對象。 使用instanceof List檢查給定對象是否為List。 由於運行時類型擦除,List的泛型類型將不可用

如果您的login方法返回Object類型,則無法以您嘗試的方式檢查此方法。 由於類型擦除,類型參數僅在編譯時存在。 您需要檢查重新調整的對象是List還是Collection還是Iterable ,然后迭代它並檢查每個項目(如果它是LoginCredentialsBean的實例)。

但是,您的代碼是糟糕設計的一個例子。 返回String或列表的方法是錯誤的。 為了使它正確:

  • 讓它返回List<LoginCredentialsBean>
  • 如果驗證失敗,則拋出已檢查的異常

public static List<LoginCredentialsBean> login(DataManager dataManager, String userName, String password) throws AuthenticationException {...}

注意:使用boolean來保留邏輯數據而不是"true""false"字符串。

如何在 ArrayList 中查找重復項<object> ?<div id="text_translate"><p> 這是一個很常見的問題,但我找不到這部分:</p><p> 假設我有這個數組列表:</p><pre> List&lt;MyDataClass&gt; arrayList = new List&lt;MyDataClass&gt;; MyDataClass{ String name; String age; }</pre><p> 現在,我需要根據MyDataClass中的age查找重復項並將其刪除。 如何使用<a href="http://www.javadb.com/remove-duplicate-items-from-an-arraylist" rel="nofollow">此處</a>描述的 HashSet 之類的東西?</p><p> 我想,我們需要覆蓋 MyDataClass 中的equals嗎?</p><ol><li> 但是,如果我沒有這樣做的奢侈呢?</li><li> 而HashSet實際上是如何在內部找到並且不添加重復項的? 我<a href="http://www.google.com/codesearch#TTY8xLpnKOE/src/share/classes/java/util/HashSet.java&amp;q=HashSet&amp;type=cs&amp;l=103" rel="nofollow">在 OpenJDK 中</a>看到了它的實現,但無法理解。</li></ol></div></object>

[英]How to find duplicates in an ArrayList<Object>?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

相關問題 toString一個包含對象的數組列表 如何通過屬性在ArrayList中查找對象 如何找到沒有arrayList的對象 如何在 ArrayList 中查找重復項<object> ?<div id="text_translate"><p> 這是一個很常見的問題,但我找不到這部分:</p><p> 假設我有這個數組列表:</p><pre> List&lt;MyDataClass&gt; arrayList = new List&lt;MyDataClass&gt;; MyDataClass{ String name; String age; }</pre><p> 現在,我需要根據MyDataClass中的age查找重復項並將其刪除。 如何使用<a href="http://www.javadb.com/remove-duplicate-items-from-an-arraylist" rel="nofollow">此處</a>描述的 HashSet 之類的東西?</p><p> 我想,我們需要覆蓋 MyDataClass 中的equals嗎?</p><ol><li> 但是,如果我沒有這樣做的奢侈呢?</li><li> 而HashSet實際上是如何在內部找到並且不添加重復項的? 我<a href="http://www.google.com/codesearch#TTY8xLpnKOE/src/share/classes/java/util/HashSet.java&amp;q=HashSet&amp;type=cs&amp;l=103" rel="nofollow">在 OpenJDK 中</a>看到了它的實現,但無法理解。</li></ol></div></object> 在包含短語的 ArrayList 中查找字符串 如何在包含不同對象的ArrayList中添加對象組的結尾 如何保存包含視圖對象的ArrayList的對象? 如何迭代對象的數組列表以查找指定的對象 如何使用 contains 方法在數組列表中查找對象 如何在arrayList中找到最長的字符串對象
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM