2014-10-04 2 views
0

У меня есть проблема с использованием значений HashMap типа HashSet. Я объявил его как следует:Использование значений HashMap типа HashSet

HashMap<Double, HashSet<Double>> pre = new HashMap<Double, HashSet<Double>>(); 

В моей программе я порождающие пифагорейских троек (а, б, в). Я хочу добавить b в HashSet, соответствующий ключу a, и добавить a в HashSet, соответствующий ключу b. Есть 9 троек с периметром менее 60:

3 4 5 
6 8 10 
9 12 15 
12 16 20 
15 20 25 
5 12 13 
10 24 26 
7 24 25 
15 8 17 

Таким образом, после генерации каждой тройки, я должен обновить HashSet, соответствующий а или б. После завершения HashMap будет выглядеть следующим образом:

1:    14: 
2:    15: 8, 20 
3: 4    16: 12 
4: 3    17: 
5: 12    18: 
6: 8    19: 
7: 24    20: 15 
8: 6, 15   21: 
9: 12    22: 
10: 24   23: 
11:    24: 7, 10 
12: 5, 9, 16  25: 
13:    26: 

Как это сделать? Любая помощь будет оценена.

Вот мой код:

import java.io.*; 
import java.util.*; 
import java.math.*; 

public class prob { 
    public static double P = 60.0; 
    public static double primCount = 0.0; 
    public static double tripCount = 0.0; 
    public static ArrayList<Triple> pt = new ArrayList<Triple>(); 
    public static HashMap<Double, HashSet<Double>> pre = new HashMap<Double, HashSet<Double>>(); 
    public static void main(String[] args) { 
     double start = System.currentTimeMillis(); 
     double sum = 0.0; 
     for (int i = 0; i < 30; i++) { 
      pre.put((double)i, new HashSet<Double>(0)); 
     } 
     p(3.0, 4.0, 5.0); 
     for (int i = 0; i < pre.size(); i++) { 
      System.out.println(pre.get(i)); 
     } 
     double end = System.currentTimeMillis(); 
     System.out.println("Time elapsed : " + (end - start)/1000d + " seconds"); 
    } 

    public static void p(double A, double B, double C) { 
     double a = A, b = B, c = C; 
     if (a + b + c > P) { 
      return; 
     } 
     primCount++; 
     double I = Math.floor(P/(a + b + c)); 
     tripCount += I; 
     for (double i = 1; i <= I; i++) { 
      pt.add(new Triple(a * i, b * i, c * i)); 
      HashSet<Double> copya = pre.get(a * i); 
      copya.add(b * i); 
      pre.remove(a * i); 
      pre.put(a * i, copya); 
      HashSet<Double> copyb = pre.get(b * i); 
      copyb.add(a * i); 
      pre.remove(b * i); 
      pre.put(b * i, copyb); 
     } 
     p(a - 2 * b + 2 * c, 2 * a - b + 2 * c, 2 * a - 2 * b + 3 * c); 
     p(a + 2 * b + 2 * c, 2 * a + b + 2 * c, 2 * a + 2 * b + 3 * c); 
     p(2 * b - a + 2 * c, b - 2 * a + 2 * c, 2 * b - 2 * a + 3 * c); 
    } 
} 
+1

Что вы пытались? –

+0

@ Джонатан Клотье, я добавил свой код. – user2784016

+0

Я думаю, что ваш пример вывода имеет ошибку: не стоит ли говорить '15: 8, 20', а не просто' 15: 20'? –

ответ

0

Ваш ключ является двойным, но вы получите значение пропускания Int, просто добавьте бросание и работать для меня:

for (int i = 0; i < pre.size(); i++) { 
     System.out.println(pre.get((double)i)); 
    } 

или с использованием Еогеасп делают меньше ошибок:

for (Entry<Double, HashSet<Double>> entry : pre.entrySet()) { 
     System.out.println(entry.getKey() + " : " + pre.values()); 
    } 

более того, при добавлении значения в суб коллекции вам не нужно перезаписать его, просто используйте его напрямую:

pt.add(new Triple(a * i, b * i, c * i)); 
    pre.get(a * i).add(b * i); 
    pre.get(b * i).add(a * i); 
+1

Большое спасибо. Трудно заметить такую ​​небольшую ошибку. – user2784016

+0

Вы можете принять ответ, если он решит вашу проблему. Спасибо –

+0

Я не могу проголосовать за ответ, так как моя репутация ниже 15. :( – user2784016

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