[英]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()
。
根据要求,我还添加了一些将来的提示。
尽管不一定是不好的做法,但更多地是个人喜好,我不会用葡萄牙语(在这种情况下似乎是这种语言)或英语以外的任何其他语言来命名我的类/变量。 在这种情况下,它可使代码对其他人更具可读性。
public class Queries extends LigarBD
我不确定在数据库上执行查询的类是否应该扩展连接到数据库的类。 相反, 使用连接到数据库的类似乎更合适。
您的代码中的某些模式super.ligar()
例如super.ligar()
, super.getConexao()
, super.desligar()
很容易看出来,您可以在与我们共享的两种方法中进行操作。 您似乎对使用LigarBD
提供的接口LigarBD
,而不是对其进行扩展或添加功能。 您可以通过声明类型为LigarBD
的实例变量并相应地使用它来更改此设置。
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
所有值。 或者您将来会在此循环中添加其他内容,但我想指出的是,这可能是将来的错误来源。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.