Отфильтруйте карту по одной строке для кратного десяти, основываясь на разнице в порядке убывания в java

1

У меня есть метод, с помощью которого я могу фильтровать строки на несколько из десяти, т.е. Я могу фильтровать строки, которые являются ближайшими к кратным десяткам, таким как 10,20,30 и т.д. В порядке возрастания. Теперь я хочу сделать тот же процесс в порядке убывания.

Пожалуйста, обратитесь к следующему массиву фильтров link- в одну строку на несколько из десяти основанных на различии?

В вышеупомянутой ссылке тот же процесс выполняется в порядке возрастания, я хочу сделать это в порядке убывания и хранить значения на карте. Но я не могу этого сделать.

Я использую следующий код для извлечения строк, где beam_current несколько из десяти в возрастающем order-

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);
}

Теперь я просто хочу обратить вспять порядок, т.е. Теперь я хочу уменьшить порядок пучка-тока, т.е. 210,22,190 и т.д.

  • 0
    Вы хотите отсортировать значения в массиве и поместить их в карту? Карта не имеет присущего ей порядка. Я не уверен, что вы пытаетесь сделать здесь.
  • 0
    Я буду использовать связанный хэш Map.It хранит значение в порядке.
Показать ещё 6 комментариев
Теги:
linkedhashmap

1 ответ

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];**

Ещё вопросы

Сообщество Overcoder
Наверх
Меню