дубликаты для linkedhashmap

Для данных, которые я ввожу в свою программу, мне требуются дубликаты, значения для каждого элемента данных, и мне требуется порядок итерации данных по порядку вставки по умолчанию.

Вот с какими данными я работаю:

y = m * x + c
y = 8, m = 3, x = 2, c = 2

То, что я использовал до сих пор, — это linkedHashMap для хранения всех моих данных, который удовлетворяет всем моим критериям, кроме хранения дубликатов.

Поэтому, если бы у меня было b + b = c, я бы не смог заставить свою программу работать.

Предпочтительно, я хотел бы продолжать использовать карты для свойства ключа и значения и возможность хранить различные типы данных, например String, Integer. Поэтому я бы предпочел, чтобы связанная хэш-карта сохраняла дубликаты. Если нет, пожалуйста, дайте мне знать, есть ли другой способ удовлетворить все мои требования.

С уважением


person Digitalwolf    schedule 21.01.2013    source источник
comment
Java не допускает дублирования в ключевом поле карты. Объект, который сопоставляет ключи со значениями. Карта не может содержать повторяющиеся ключи; каждый ключ может соответствовать не более чем одному значению. docs.oracle.com/javase/1.4. 2/docs/api/java/util/Map.html   -  person Arun P Johny    schedule 21.01.2013
comment
Зачем нужна карта для хранения значений. Даже вы можете использовать класс для хранения значений, если у вас есть фиксированный набор параметров..e.g. у, м, х, в. Вы можете передать класс или примитив методу для завершения функциональности. А также, Вы можете контролировать отсутствие ввода.   -  person Shashi    schedule 21.01.2013
comment
Я беру свои значения из ввода файла, и ввод очень разнообразен. Было довольно легко настроить linkedHashMap для хранения всех моих данных, и мне нужны мои данные, чтобы создавать связи друг с другом. Это немного сложно. Вот почему я решил пойти по пути, который я выбрал.   -  person Digitalwolf    schedule 21.01.2013
comment
Предположительно, вы используете LinkedHashMap для сохранения порядка ввода. Чем linkedHashMap проще, чем сохранение значения в классе? Вы можете использовать конструктор и метод для хранения значений вместо пятикратного вызова метода put из linkedhashmap.   -  person Shashi    schedule 21.01.2013
comment
Да, исходя из моего вышеуказанного вопроса, это было бы проще, но для моих целей и сложности данных это требует больше времени. К сожалению, это, вероятно, путь, по которому мне придется идти. Спасибо   -  person Digitalwolf    schedule 21.01.2013


Ответы (3)


package com.shashi.mpoole;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Field;
import java.net.URISyntaxException;

public class LinearEquation {

    public static void main(String[] args) throws URISyntaxException {


        LinearEquation linearEquation = new LinearEquation();
         InputStream in = LinearEquation.class.getResourceAsStream("../../../Inputs.txt");

            // Inputs Taken
            try {
                // Reading Inputs
                BufferedReader reader=new BufferedReader(new InputStreamReader(in));
                String line=null;
                // Separated by Comma m=4,x=2,c=5
                    while((line=reader.readLine())!=null){
                        LinearEqInput lei = new LinearEqInput();
                        String[] inputs = line.split(",");
                        //Getting array [m=4,x=2,c=5]
                        for (int i = 0; i < inputs.length; i++) {

                            String[] keyval = inputs[i].split("=");
                            //Getting vallue [m,4]
                            linearEquation.setValue(lei, keyval[0], keyval[1]);

                        }
                        System.out.print("[Inputs: m= " + lei.m + " x= " + lei.x + " ,c= " + lei.c + "]");
                        //result
                        System.out.println(" Output :" + linearEquation.calculate(lei));

                    }
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


    }

    // This method use reflection to store the value of a field in the class LinearEqInput
    public void setValue(LinearEqInput lei,String fieldName, String value) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException
    {
        Field f = lei.getClass().getDeclaredField(fieldName);
        f.setDouble(lei, Double.parseDouble(value));

    }

    //Calculating the Y
    public double calculate(LinearEqInput lei)
    {
        return lei.m*lei.x + lei.c;
    }



}



class LinearEqInput
{
//Inputs
    double m,x,c = 0;

}

Входной файл

m=4,x=3,c=1
m=4,x=4,c=6
m=4,x=5,c=5
m=4,x=7,c=4
m=4,x=2,c=3
m=4,x=5,c=2

Выход:

[Inputs: m= 4.0 x= 3.0 ,c= 1.0] Output :13.0
[Inputs: m= 4.0 x= 4.0 ,c= 6.0] Output :22.0
[Inputs: m= 4.0 x= 5.0 ,c= 5.0] Output :25.0
[Inputs: m= 4.0 x= 7.0 ,c= 4.0] Output :32.0
[Inputs: m= 4.0 x= 2.0 ,c= 3.0] Output :11.0
[Inputs: m= 4.0 x= 5.0 ,c= 2.0] Output :22.0
person Shashi    schedule 21.01.2013
comment
Спасибо за усилия, вы сэкономили мне много времени. По какой-то причине ваш getResourceAsStream не работает на моей стороне, но исправил это с потоком dataInput и fileInput. Есть идея, как интегрировать это с моим уже существующим кодом = D, спасибо. - person Digitalwolf; 21.01.2013

Вы можете использовать Map<Integer,List<Integer>> . В этом типе данных вы можете хранить несколько значений для одного и того же ключа. Ваш метод ввода может быть таким...

    public void put(Integer key,Integer val){
     List<Integer> arr = map.get(key);
     if(arr == null){
      arr = new ArrayList<Integer>();
      map.put(key,arr);
     }
     arr.add(val);
    }
person Partha Pal    schedule 21.01.2013

Используйте Multimap библиотеки Guava с типом значения Object. Ознакомьтесь с их документацией. для получения дополнительной информации.


  Multimap map = ArrayListMultimap.create();
  map.put(key, value1);
  map.put(key, value2);
  List values = map.get(key);
person Mirko Adari    schedule 21.01.2013
comment
Спасибо, судя по тому, что я читал, все в порядке. Что это означает, в зависимости от реализации, MultiMap разрешает или запрещает дублирование. Если у меня есть дубликаты в моих данных, это будет автоматически? - person Digitalwolf; 21.01.2013
comment
По сути, это карта списков. Таким образом, вы можете иметь различное количество значений для каждого ключа. - person Mirko Adari; 21.01.2013
comment
Каков синтаксис мультикарты. Если я поставлю MultiMap mhm = new MultiHashMap();, это выдаст мне ошибку, и единственный вариант - создать класс с именем MultiMap. - person Digitalwolf; 21.01.2013
comment
ArrayListMultimap‹K,V›.create() - person Mirko Adari; 21.01.2013