В настоящее время у меня есть ArrayList
, содержащий объекты созданного мною класса, затем я анализирую ArrayList
в for loop
, ища и сравнивая некоторые данные из ArrayList
и некоторые глобальные variables
, которые загружается в другое место, где, однако, этот ArrayList
постоянно растет и в конце концов к концу будет иметь около 115 элементов, что затем займет очень много времени для поиска, функция, которая делает это, также вызывается один раз для каждой строки, которую я читаю из текстового файла и текстового файла обычно будет иметь длину около 400-500 строк, так что вы можете сказать, что это очень медленный процесс, даже при тестировании небольших файлов. Есть ли способ ускорить это, возможно, используя другой collection
вместо ArrayList
, поэтому я считаю необходимым использовать ArrayList
, я должен знать, по какому индексу он находится, когда находит совпадение.
Вот класс:
private ArrayList<PanelData> panelArray = new ArrayList<PanelData>(1);
public class PanelData {
String dev = "";
String inst = "";
double tempStart = 0.0;
double tempEnd = 0.0;
}
Функция:
public void panelTimeHandler (double timeStart, double timeEnd) throws SQLException {
PanelData temps = new PanelData();
temps.dev = devIDStr;
temps.inst = instanceStr;
temps.tempStart = timeStart;
temps.tempEnd = timeEnd;
boolean flag = false;
if(!flag)
{
panelArray.add(temps);
flag = true;
}
for(int i = 0; i < panelArray.size(); ++i ) {
if(panelArray.get(i).dev.equals(devIDStr) && panelArray.get(i).inst.equals(instanceStr)) {
if(panelArray.get(i).tempStart <= timeStart && panelArray.get(i).tempEnd >= timeEnd ) {
//Do Nothing
}
else
{
temps.dev = devIDStr;
temps.inst = instanceStr;
temps.tempStart = timeStart;
temps.tempEnd = timeEnd;
insert();
panelArray.set(i, temps);
}
}
else
{
temps.dev = devIDStr;
temps.inst = instanceStr;
temps.tempStart = timeStart;
temps.tempEnd = timeEnd;
panelArray.add(temps);
insert();
}
}
}
Если есть что-то еще, что вы хотели бы увидеть, просто спросите, спасибо. Говядина.
Обновление: добавлена функция вставки ()
private void insert() throws SQLException
{
stmt = conn.createStatement();
String sqlStm = "update ARRAY_BAC_SCH_Schedule set SCHEDULE_TIME = {t '" + finalEnd + "'} WHERE SCHEDULE_TIME >= {t '" + finalStart + "'} AND" +
" SCHEDULE_TIME <= {t '" + finalEnd + "'} AND VALUE_ENUM = 0 AND DEV_ID = " + devIDStr + " and INSTANCE = " + instanceStr;
int updateSuccess = stmt.executeUpdate(sqlStm);
if (updateSuccess < 1)
{
sqlStm = "insert into ARRAY_BAC_SCH_Schedule (SITE_ID, DEV_ID, INSTANCE, DAY, SCHEDULE_TIME, VALUE_ENUM, Value_Type) " +
" values (1, " + devIDStr + ", " + instanceStr + ", " + day + ", {t '" + finalStart + "'}, 1, 'Unsupported')";
stmt.executeUpdate(sqlStm);
sqlStm = "insert into ARRAY_BAC_SCH_Schedule (SITE_ID, DEV_ID, INSTANCE, DAY, SCHEDULE_TIME, VALUE_ENUM, Value_Type) " +
" values (1," + devIDStr + ", " + instanceStr + ", " + day + ", {t '" + finalEnd + "'}, 0, 'Unsupported')";
stmt.executeUpdate(sqlStm);
}
if(stmt!=null)
stmt.close();
}
Обновление:
Спасибо Matteo, я понял, что добавляю в массив, даже если не найду совпадения до 10-го элемента, он будет добавлен в массив первые 9 раз, что создало много дополнительных элементов в массиве, поэтому это было так медленно, я добавил несколько перерывов и немного изменил функцию, и это значительно улучшило производительность. Спасибо за все вклады