0

EDIT:

Sorry forr the misspellings and typos, I didn't want to put my code here so I tried to make a new look a like code to express my question.

Here is the actual code I'm using, I just removed some parts of it as they are not related to my question, I think, otherwise just ask me and I'll put it here as well.

Heres the actual code:

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

}

//another class from now on

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

}

Another class:

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


}

And here is where I'm printing each object one by one:

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());
        }

So I was expecting it to change the value of pingPong in all objects to 1 but it doesn't.

I think the problem is with the returning from the method detectPingPongArray but I don't know where is the mistake.

Anyone can pinpoint the problem here?


To avoid having to use strdup() which is a little 'messier' because it leaves the freeing of the memory up to the caller instead of taking care of everything itself, I modified my existing structure as follows:

typedef struct 
{
    char name[32];
    char index[32];
    int optional;
} StatusItem;

This allows 32 bytes for the name and index, which should be more than enough. Before, the structures fields were pointing to nothing, which was causing the error when trying to copy to that location. now, there is empty (or junk) memory waiting for the string to be placed in.

This allows for strcpy() to still be used, and allows for an overall cleaner implementation.

4

1 に答える 1

3

問題

sのジェネリックを無視するなど、コードにはいくつかの悪い慣行があると思いますが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
    データベースに対してクエリを実行するクラスが、データベースに接続するクラスを拡張する必要があるかどうかはわかりません。代わりに、データベースに接続するクラスを使用する方が適切と思われます。これは、、

    、 など、コード内のいくつかのパターンで簡単に確認できます。これは、共有した両方のメソッドで実行します。によって提供されるインターフェイスを使用することに関心があるようですが、それを拡張したり、機能を追加したりすることはありません。type のインスタンス変数を宣言し、それに応じて使用することで、これを変更できます。super.ligar()super.getConexao()super.desligar()LigarBDLigarBD

  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ループは変数に新しい値を代入するだけで、何もせず、常に上書きします。

ArrayListおそらく、このループに 2 番目のループも含めて、に割り当てられているすべてのすべての値を効果的に出力する必要がありますdataForPPong。または、将来このループ内に何か他のものを追加するだけですが、これが将来のバグの原因になる可能性があることを指摘したいと思います。

于 2013-06-03T20:38:48.367 に答える