У меня есть метод, с помощью которого я могу фильтровать строки на несколько из десяти, т. Е. Я могу фильтровать строки, которые являются ближайшими к кратным десяткам, таким как 10 , 20,30 и т. Д. В порядке возрастания. Теперь я хочу сделать тот же процесс в порядке убывания.Отфильтруйте карту в одну строку на несколько из десяти, основываясь на различии в порядке убывания в java
Пожалуйста, обратитесь к следующей ссылка- Filter array to one row per multiple of ten, based on difference?
В указанной выше ссылке, тот же процесс происходит в порядке возрастания, я хочу сделать это в порядке убывания и хранить значения в map.But I» м не в состоянии сделать.
Я использую следующий код для извлечения строк, где beam_current кратно десять в возрастающем заказе запасного
public static LinkedHashMap<Double, String> ClosestToMultiplesOfTen_User() throws SQLException {
int row_id ;
int bIdx = 0;
double[] vals = new double[34];
// double[] bucket =new double[bucketCount];
int rowIndex = 0 ;
int i=0;
try
{
con = getConnection();
stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
// String sql="select logtime,beam_current from INDUS2_BDS.dbo.DCCT where logtime between '"+name+" 00:00:00' and '"+name+" 23:59:59'"+
// "and (beam_current like '%9.96' or beam_current like '%9.97' or beam_current like '%9.98' or beam_current like '%9.99' or beam_current like '%0' or beam_current like '%_0.01' or beam_current like '%_0.02' or beam_current like '%_0.03' or beam_current like '%_0.04' or beam_current like '%_0.05' or beam_current like '%_0.06') and beam_energy between '550' and '552'";
String sql="select logtime,beam_current from INDUS2_BDS.dbo.DCCT where logtime between '2014-10-10 08:50:00' and '2014-10-10 12:50:00'"+
"and (beam_current like '%9.96' or beam_current like '%9.97' or beam_current like '%9.98' or beam_current like '%9.99' or beam_current like '%0' or beam_current like '%_0.01' or beam_current like '%_0.02' or beam_current like '%_0.03' or beam_current like '%_0.04' or beam_current like '%_0.05' or beam_current like '%_0.06')";
System.out.println("Value of sql of ClosestToMultiplesOfTen_User is"+sql);
stmt.executeQuery(sql);
rs = stmt.getResultSet();
while(rs.next())
{
for(int j=0; j<1; j++)
{
vals[i] = rs.getDouble(2);
}
i++;
}
}
catch(Exception e)
{
System.out.println("\nException "+e);
}
// get the max value, and its multiple of ten to get the number of buckets
double max = java.lang.Double.MIN_VALUE;
for (double v : vals) max = Math.max(max, v);
int bucketCount = 1 + (int)(max/10);
double[] bucket =new double[bucketCount];
// initialise the buckets array to store the closest values
double[][] buckets = new double[bucketCount][3];
for (int i1 = 0; i1 < bucketCount; i1++){
// store the current smallest delta in the first element
buckets[i1][0] = java.lang.Double.MAX_VALUE;
// store the current "closest" index in the second element
buckets[i1][1] = -1d;
// store the current "closest" value in the third element
buckets[i1][2] = java.lang.Double.MAX_VALUE;
}
// iterate the rows
for (row_id=1 ; row_id < vals.length; row_id++)
{
// get the value from the row
double v = vals[row_id];
// get the closest multiple of ten to v
double mult = getMultipleOfTen(v);
// get the absolute distance of v from the multiple of ten
double delta = Math.abs(mult - v);
// get the bucket index based on the value of `mult`
bIdx = (int)(mult/10d);
// System.out.println("value of bidx for bucket index is"+bIdx);
// test the last known "smallest delta" for this bucket
if (buckets[bIdx][0] > delta)
{
// this is closer than the last known "smallest delta"
buckets[bIdx][0] = delta;
buckets[bIdx][1] = row_id;
buckets[bIdx][2] = v;
}
}
// print out the result
for (int i1 =1; i1 <buckets.length; i1++)
{
bucket = buckets[i1];
rowIndex = (int) bucket[1];
int row_no=rowIndex+1;
double rowValue = bucket[2];
System.out.println("row index "+row_no+ "value is "+rowValue);
DecimalFormat twoDForm = new DecimalFormat("#.##");
rs.absolute(rowIndex);
user_current_map.put(java.lang.Double.valueOf(twoDForm.format(rs.getDouble(2))),(rs.getString(1)));
// map1.put(rs.getString(2),(rs.getString(1)));
//l.add(map1);
}
System.out.println("user_current_map "+user_current_map);
return user_current_map;
}
public static double getMultipleOfTen(double v)
{
System.out.println(10d * Math.round(v/10d));
return 10d * Math.round(v/10d);
}
Теперь я просто хочу, чтобы изменить порядок т.е. теперь я хочу убывающий порядок beam_current т.е. 210 , 22190 и т.д.
Вы хотите, чтобы отсортировать значения в массиве и положить их в карту? Карта не имеет неотъемлемого смысла порядка. Я не уверен, что вы пытаетесь сделать здесь. –
Я буду использовать связанный хэш Map.It сохраняет значение в порядке. –
Ах. Быстрое и грязное решение заключалось бы в том, чтобы переключить порядок, в который вы положили значения на свою карту. Итерации из задней части списка в отличие от фронта, ex 'for (int i = list.size(); i> 0; i -)'. –