簡體   English   中英

傳遞一個ArrayList <Object> 作為方法的參數,處理arrayList並將其返回-Java

[英]Pass an ArrayList<Object> as an argument to a method, process the arrayList and return it - Java

編輯:

很抱歉,拼寫錯誤和錯別字,我不想在這里放我的代碼,所以我試圖使外觀看起來像新代碼來表達我的問題。

這是我正在使用的實際代碼,我想刪除了它的某些部分,因為它們與我的問題無關,否則請問我,我也將其放在這里。

這是實際的代碼:

public class Dados {

    private String sta;
    private String ap;
    private int startTime;
    private int endTime;
    private int repetitionSTA;
    private int pingPong;
    private int tt_previous;
    private int tt_next;
    private int id;

    public Dados(int id, int startTime, int endTime, String ap, String sta, int repetitionSTA, int ttprevious, int ttnext, int ppong)
    {
        this.sta = sta;
        this.ap = ap;
        this.startTime = startTime;
        this.endTime=endTime;
        this.pingPong = ppong;
        this.tt_next = ttnext;
        this.tt_previous = ttprevious;
        this.id = id;
        this.repetitionSTA = repetitionSTA;
    }

    // SET

    public void setPingPong()
    {
        this.pingPong = 1;
    }


    //GET

    public int getPingPong()
    {
        return this.pingPong;
    }

}

//從現在開始的另一個類

public class Queries extends LigarBD{

    String dbtime = null; 

    int id = 1;

    TreeMap<Integer, ArrayList> tmValores = new TreeMap<>();
    ArrayList<Dados> listaObjectos = new ArrayList<>();
    ArrayList<Dados> listaObjectos2 = new ArrayList<>();


    public ArrayList getUniqueStations(String server)
    {
        ArrayList<String> listaSTA = new ArrayList<>();

        String query = "SELECT distinct calling_station_id FROM java_logs;";

        try
        {
            super.ligar(server);
            Statement s = super.getConexao().createStatement();
            ResultSet rs = s.executeQuery(query);
            while (rs.next())
            {
                listaSTA.add(rs.getString(1));
            }
            rs.close();
            s.close();
            super.desligar(super.getConexao());

        }
        catch (Exception e)
        {
            JOptionPane.showMessageDialog(null, "Error at listing all unique stations. Reason -> "+e.getMessage());
            System.out.println("Error at listing all unique stations. Reason ->  "+e.toString());
        }

        return listaSTA;
    }


    public ArrayList getStationData(String mac, String server)
    {

        try 
        {
            super.ligar(server);
            Statement s = getConexao().createStatement();

            ResultSet rs = s.executeQuery("SELECT timestamp-acct_session_time, timestamp, called_station_id, calling_station_id "
                                        + "FROM java_logs where calling_station_id = '"+mac+"';"); // retirar STA da query *******************
            //System.out.println("Executing the Query on+"+server+" - UniqueSTA - Query number: 1?");
            int repetitionSTA=1;
            while (rs.next()) 
            {              
                Dados d = new Dados(id, rs.getInt(1), rs.getInt(2), rs.getString(3), rs.getString(4), repetitionSTA, 0, 0, 0);

                listaObjectos2.add(d);
                repetitionSTA++;
                id++;
            }

            rs.close();
            s.close();
            super.desligar(super.getConexao());
        }
        catch (Exception e) 
        {
            JOptionPane.showMessageDialog(null,"Error at Select Query. Reason -> "+e.getMessage());
        }

        return listaObjectos2;
    }

}

另一類:

public class Pingpong {

    ArrayList<Dados> dadosArray = new ArrayList<>();



    Queries q = new Queries();

    TreeMap<Integer, ArrayList> mapa = new TreeMap<>();
    ArrayList<Dados> arrayDeDados = new ArrayList<>();


    public ArrayList detectPingPongArray(int threshold_access_session_time, int threshold_transition_time, ArrayList<Dados> dadosSTA)
    {
        dadosArray=dadosSTA;
        for(int i = 1; i<arrayDeDados.size()-1; i++)
        {
            dadosArray.get(i).setPingPong();
        }
        return dadosArray;
    }


}

這是我逐個打印每個對象的位置:

ArrayList<Dados> dadosSTA = new ArrayList<>();
        ArrayList<Dados> dataForPPong = new ArrayList();

        ArrayList uniqueSTA = q.getUniqueStations("localserver");

        for(int i = 0; i<uniqueSTA.size(); i++)
        {
            dadosSTA = q.getStationData(uniqueSTA.get(i).toString(), "localserver");
            dataForPPong = p.detectPingPongArray(5, 3, dadosSTA);

        }

        for(int i=0; i<dataForPPong.size(); i++)
        {
            System.out.println("ID: "+dataForPPong.get(i).getId()+" STA: "+dataForPPong.get(i).getStation()
                    + " PingPong: "+dataForPPong.get(i).getPingPong());
        }

因此,我期望它可以將所有對象中pingPong的值更改為1,但事實並非如此。

我認為問題出在方法detectPingPongArray的返回上,但我不知道錯誤在哪里。

任何人都可以在這里查明問題嗎?

問題

我想說您的代碼中有一些不良做法,例如不理會ArrayList的泛型,但讓我們開始討論。

在我看來,您的問題出在以下方法中:

public ArrayList detectPingPongArray(
        int threshold_access_session_time,
        int threshold_transition_time,
        ArrayList<Dados> dadosSTA
) {
    dadosArray=dadosSTA;
    for(int i = 1; i<arrayDeDados.size()-1; i++) {
        dadosArray.get(i).setPingPong();
    }
    return dadosArray;
}

這是您的代碼,只是格式不同以適合答案。

該方法接收一個ArrayList<Dados> dadosSTA ,您將其分配給dadosArray
您返回相同的變量,並且想要對其進行修改。

但是,您正在遍歷arrayDeDados的大小,這是一個與 ArrayList<Dados> 不同的大小,並且根據您提供的信息,它也是一個列表。

ArrayList<Dados> arrayDeDados = new ArrayList<>();

因此,由於空列表的size()為零,因此不會執行任何迭代,並且永遠不會調用setPingPong()


提示

根據要求,我還添加了一些將來的提示。

  1. 盡管不一定是不好的做法,但更多地是個人喜好,我不會用葡萄牙語(在這種情況下似乎是這種語言)或英語以外的任何其他語言來命名我的類/變量。 在這種情況下,它可使代碼對其他人更具可讀性。

  2. public class Queries extends LigarBD
    我不確定在數據庫上執行查詢的類是否應該擴展連接到數據庫的類。 相反, 使用連接到數據庫的類似乎更合適。

    您的代碼中的某些模式super.ligar()例如super.ligar()super.getConexao()super.desligar()很容易看出來,您可以在與我們共享的兩種方法中進行操作。 您似乎對使用LigarBD提供的接口LigarBD ,而不是對其進行擴展或添加功能。 您可以通過聲明類型為LigarBD的實例變量並相應地使用它來更改此設置。

  3. public ArrayList detectPingPongArray
    在這里,您丟棄了與ArrayList相關的常規信息。 如果您知道將返回ArrayList<Dados> ,並且希望此方法的調用者也知道該方法,則應按以下方式聲明該方法:
    public ArrayList<Dados> detectPingPongArray

    這樣,調用者將期望ArrayList<Dados> ,而不是某些東西ArrayList (可能會引入不安全的強制類型轉換/操作)。


進一步分析

我也不確定這是否是故意的,但是我發現您的代碼中有些奇怪的東西。

ArrayList<Dados> dadosSTA = new ArrayList<>();
ArrayList<Dados> dataForPPong = new ArrayList();

ArrayList uniqueSTA = q.getUniqueStations("localserver");

for(int i = 0; i<uniqueSTA.size(); i++)
{
    dadosSTA = q.getStationData(uniqueSTA.get(i).toString(), "localserver");
    dataForPPong = p.detectPingPongArray(5, 3, dadosSTA);
}

for(int i=0; i<dataForPPong.size(); i++)
{
    System.out.println("ID: "+dataForPPong.get(i).getId()+" STA: "+dataForPPong.get(i).getStation()
            + " PingPong: "+dataForPPong.get(i).getPingPong());
}

第一個for循環只是為變量分配新值,對它們不執行任何操作並不斷覆蓋它們。

可能您希望此循環還包括第二個循環,以便有效地打印分配給dataForPPong每個ArrayList所有值。 或者您將來會在此循環中添加其他內容,但我想指出的是,這可能是將來的錯誤來源。

傳安 ArrayList<customobject> 到接受 ArrayList 作為參數的 function<object> 在 Java<div id="text_translate"><p> 我正在編寫一個通用的 java-android function,它將接受ArrayList<Object>作為其參數之一,這樣我就可以在我的整個應用程序中使用,而不管 ArrayList 元素的類型如何。</p><p> 這是我的 function:</p><pre> public GenericDisplayAdapter(Activity activity, ArrayList<Object> arrData) { this.m_ArrData = arrData; inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); }</pre><p> 當我嘗試將我的ArrayList<CustomObject>作為參數傳遞給此 function 時,出現錯誤“無法從ArrayList<CustomObject>轉換為ArrayList<Object> ”,</p><pre> m_LVStructDamageHeader.setAdapter(new GenericDisplayAdapter( (Activity)this, (ArrayList<Object>)arrStructDamageHeaders));</pre><p> 處理這種情況的最佳方法是什么,謝謝</p></div></object></customobject>

[英]Pass An ArrayList<CustomObject> to a function that accepts as parameter an ArrayList<Object> in Java

暫無
暫無

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

相關問題 如何將 ArrayList 傳遞給 Java 中的方法? Java ArrayList - 返回ArrayList 在 Java 中對數組列表的對象使用方法 Java ArrayList get()方法不返回Point對象? Java 方法讀取文本文件並返回 ArrayList 類型 object Java反射-傳入ArrayList作為要調用的方法的參數 傳安 ArrayList<customobject> 到接受 ArrayList 作為參數的 function<object> 在 Java<div id="text_translate"><p> 我正在編寫一個通用的 java-android function,它將接受ArrayList<Object>作為其參數之一,這樣我就可以在我的整個應用程序中使用,而不管 ArrayList 元素的類型如何。</p><p> 這是我的 function:</p><pre> public GenericDisplayAdapter(Activity activity, ArrayList<Object> arrData) { this.m_ArrData = arrData; inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); }</pre><p> 當我嘗試將我的ArrayList<CustomObject>作為參數傳遞給此 function 時,出現錯誤“無法從ArrayList<CustomObject>轉換為ArrayList<Object> ”,</p><pre> m_LVStructDamageHeader.setAdapter(new GenericDisplayAdapter( (Activity)this, (ArrayList<Object>)arrStructDamageHeaders));</pre><p> 處理這種情況的最佳方法是什么,謝謝</p></div></object></customobject> Java ArrayList 方法返回 0 而不是 ArrayList 的實際長度 Java ArrayList,返回抽象類的ArrayList的訪問方法 將arraylist作為參數傳遞給方法
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM