gpt4 book ai didi

java - 将 ArrayList 作为参数传递给方法,处理 arrayList 并返回它 - Java
转载 作者:行者123 更新时间:2023-12-01 23:46:51 28 4
gpt4 key购买 nike

编辑:

很抱歉出现拼写错误和拼写错误,我不想将我的代码放在这里,所以我尝试使新的外观类似于代码来表达我的问题。

这是我正在使用的实际代码,我只是删除了其中的一些部分,因为它们与我的问题无关,我想,否则就问我,我也会把它放在这里。

下面是实际代码:

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,但事实并非如此。

我认为问题出在从方法 detectorPingPongArray 返回上,但我不知道错误在哪里。

谁能指出这里的问题吗?

最佳答案

问题

我想说您的代码中有一些不好的做法,例如忽略 ArrayList 中的泛型s,但让我们进入正题。

在我看来,您的问题出在以下方法中:

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()从未被调用过。

<小时/>

提示

根据要求,我还添加了一些针对 future 的提示。

  1. 虽然不一定是不好的做法,更多的是个人喜好,但我不会用葡萄牙语(在本例中似乎是这样)或英语以外的任何语言来命名我的类/变量。在这种情况下,它可以使代码对其他人更具可读性。

  2. public class Queries extends LigarBD
    我不确定对数据库执行查询的类是否应该扩展连接到数据库的类。相反,使用连接到数据库的类似乎更合适。

    通过代码中的某些模式很容易看出这一点,例如 super.ligar() , super.getConexao() , super.desligar() ,您在与我们分享的两种方法中都这样做了。您似乎有兴趣使用 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循环只是为变量分配新值,不对它们执行任何操作并不断覆盖它们。

您可能希望此循环也包含第二个循环,以便您有效地打印每个 ArrayList 的所有值。分配给dataForPPong 。或者您将来会在这个循环中添加其他内容,但我想指出这可能是 future 的错误来源。

关于java - 将 ArrayList<Object> 作为参数传递给方法,处理 arrayList 并返回它 - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16904827/

28 4 0