2015-03-24 4 views
0

У меня есть метод, который сохраняет значение из массива в связанный файлhashmap.Map, как 10,20 30 Теперь я хочу изменить порядок хранения карты, т.е. 30,20..so on.Is есть какая-то функция, которая может это сделать? Мой кодкак отменить ключ, сохраненный в связанномhashmap в java

это-
public LinkedHashMap<Double, String> ClosestToMultiplesOfTen_User(String start,String end) throws SQLException { 

    int row_id ; 
    int bIdx = 0; 

    //double[] vals = new double[47]; 
    double[] vals=null; 
    int rowIndex = 0 ; 
    int i=0; 

    try 
      { 
       con = getConnection(); 
       stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY); 
      String sql="select distinct beam_current from INDUS2_BDS.dbo.DCCT where logtime between '"+start+"' and '"+end+"'"+ 
         "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 FindClosestToMultiplesOfTen is"+sql); 
       stmt.executeQuery(sql); 
       rs = stmt.getResultSet(); 

      rs.last(); 
       int row_cnt=rs.getRow(); 
       System.out.println("row_count of closest " +row_cnt); 
       vals = new double[row_cnt]; 
       rs.beforeFirst(); 
     while(rs.next()) 
     { 
      for(int j=0; j<1; j++) 
      { 
       vals[i] = rs.getDouble(1); 
       System.out.println("value of beam_current at closest is "+vals[i]); 
      } 
      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]; 

    System.out.println("bucketcount in closese"+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]; 
     double rowValue = bucket[2]; 
     DecimalFormat twoDForm = new DecimalFormat("#.##"); 
     System.out.println("row index closeset "+rowIndex+ "value is closest "+rowValue); 
     rs.absolute(rowIndex+1); 
     user_current_map.put(java.lang.Double.valueOf(twoDForm.format(rs.getDouble(1))),""); 

    } 
System.out.println("user_current_map "+user_current_map); 

return user_current_map; 
} 

Этот user_current_map должен быть reversed.How сделать so.It определяется как

**LinkedHashMap<Double,String> user_current_map = new LinkedHashMap<Double,String>();** 
+0

Вы можете использовать набор ключей карты, сортировки в обратном направлении, а затем итерацию над ним, чтобы использовать ключи обратный порядок. –

+0

Просьба уточнить ваши требования: принимаете ли вы/ожидаете, что ваши ключи могут быть отсортированы; и вы хотите обработать реверс сортированных ключей? Или вы хотите, чтобы вы изменили порядок, в котором были добавлены ключи? – GhostCat

+0

Как @EddyG сказал .... уточните, хотите ли вы, чтобы порядок вставки был отменен или естественный порядок сортировки. – ha9u63ar

ответ

1

При создании LinkedHashMap упорядоченный по порядку доступа (new LinkedHashMap(initialCapacity,loadFactor,true)), итерация ключи карты и вызов get для каждого ключа будут отменять порядок, так как каждый раз, когда вы вызываете get(key), этот ключ будет перемещен в начало списка связанных записей.

Таким образом, этот цикл будет изменить порядок ключей:

LinkedHashMap<Double,String> user_current_map = new LinkedHashMap<Double,String>(16,0.75f,true); 
.... 
for (Double key : user_current_map.keySet()) { 
    String value = map.get(key); 
} 

EDIT: на самом деле это не работает. Он выдает ConcurrentModificationException, так как вы не можете изменять карту, итерации по ней.

Вот то, что, похоже, работает:

LinkedHashMap<Double,String> map = new LinkedHashMap<Double, String> (16,0.75f,true); 
map.put (0.5, "a"); 
map.put (0.6, "b"); 
map.put (0.7, "c"); 
Set<Double> keys = new HashSet(map.keySet()); 
System.out.println(); 
for (Double d : keys) { 
    String v = map.get (d); 
    System.out.println (d+","+v); 
} 
keys = new HashSet(map.keySet()); 
System.out.println(); 
for (Double d : keys) { 
    String v = map.get (d); 
    System.out.println (d+","+v); 
} 
keys = new HashSet(map.keySet()); 
System.out.println(); 
for (Double d : keys) { 
    String v = map.get (d); 
    System.out.println (d+","+v); 
} 

Выход:

0.7,c 
0.6,b 
0.5,a 

0.5,a 
0.6,b 
0.7,c 

0.7,c 
0.6,b 
0.5,a 
+0

Вы пробовали это? –

+0

@pbabcdefp Я просто сделал, он не работает. – Eran

+0

Я действительно рад, что вы все равно ответили на вопрос. Я не знал, что LinkedHashMap может храниться в порядке доступа. –

 Смежные вопросы

  • Нет связанных вопросов^_^