2015-03-23 1 views
1

У меня есть метод, с помощью которого я могу фильтровать строки на несколько из десяти, т. Е. Я могу фильтровать строки, которые являются ближайшими к кратным десяткам, таким как 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 и т.д.

+0

Вы хотите, чтобы отсортировать значения в массиве и положить их в карту? Карта не имеет неотъемлемого смысла порядка. Я не уверен, что вы пытаетесь сделать здесь. –

+0

Я буду использовать связанный хэш Map.It сохраняет значение в порядке. –

+0

Ах. Быстрое и грязное решение заключалось бы в том, чтобы переключить порядок, в который вы положили значения на свою карту. Итерации из задней части списка в отличие от фронта, ex 'for (int i = list.size(); i> 0; i -)'. –

ответ

1

чтобы представить его в обратном порядке делать, заказ по времени в вашем SQL запросе и изменить размер ведер

for (double v : vals) max = Math.max(max, v); 
Arrays.sort(vals); 
System.out.println("value at vals[0] c "+vals[0]); 
double min=vals[0]; 
int m2=(int) Math.round(min); 
int m3=(int) Math.round(max); 

**int bucketCount = 1+((m3-m2)/10); 
double[] bucket =new double[bucketCount]; 
double[][] buckets = new double[bucketCount][3];**