簡體   English   中英

使用數組作為hashmap java的關鍵

[英]Using array as key for hashmap java

我有一個方法,將一些值(從excel文件中獲取)放入一個以數組為關鍵字的hashmap

public HashMap<List<String>, List<String[]>> sbsBusServiceDataGnr() throws 
    IOException
{
    System.out.println(engine.txtY + "Processing HashMap "
        + "sbsBusServiceData..." + engine.txtN);
    int counterPass = 0, counterFail = 0, stopCounter = 0;
    String dataExtract, x = "";
    String[] stopInfo = new String[3];
    List<String[]> stopsData = new ArrayList<String[]>();
    List<String> serviceNum = new Vector<String>();

    HashMap<List<String>, List<String[]>> sbsBusServiceData = 
        new HashMap<List<String>, List<String[]>>();
    String dataPath = this.dynamicPathFinder(
        "Data\\SBS_Bus_Routes.csv");
    BufferedReader sbsBusServiceDataPop = new BufferedReader(
        new FileReader(dataPath));

    sbsBusServiceDataPop.readLine();
    //Skips first line
    while ((dataExtract = sbsBusServiceDataPop.readLine()) != null) {
        try {
            String[] dataParts = dataExtract.split(",", 5);
            if (!dataParts[4].equals("-")){
                if (Double.parseDouble(dataParts[4]) == 0.0){
                    sbsBusServiceData.put(serviceNum, stopsData);
                    String serviceNum1 = "null", serviceNum2 = "null";
                    if(!serviceNum.isEmpty()){
                        serviceNum1 = serviceNum.get(0);
                        serviceNum2 = serviceNum.get(1);
                    }
                    System.out.println("Service Number " + serviceNum1 
                        + ":" + serviceNum2 + " with " + stopCounter 
                        + " stops added.");
                    stopCounter = 0;
                    //Finalizing previous service

                    serviceNum.Clear();
                    serviceNum.add(0, dataParts[0]);
                    serviceNum.add(1, dataParts[1]);
                    //Adding new service
                }
            }
            stopInfo[0] = dataParts[2];
            stopInfo[1] = dataParts[3];
            stopInfo[2] = dataParts[4];
            stopsData.add(stopInfo);
            //Adding stop to service

            stopCounter++;
            counterPass++;
            }
        catch (Exception e) {
            System.out.println(engine.txtR + "Unable to process "
                + dataExtract + " into HashMap sbsBusServiceData." 
                + engine.txtN + e);
            counterFail++;
        }
    }
    sbsBusServiceDataPop.close();

    System.out.println(engine.txtG + counterPass + " number of lines"
        + " processed into HashMap sbsBusServiceData.\n" + engine.txtR
        + counterFail + " number of lines failed to process into "
        + "HashMap sbsBusServiceData.");

    return sbsBusServiceData;
}
//Generates sbsBusServiceDataGnr HashMap : 15376 Data Rows
//HashMap Contents: {ServiceNumber, Direction}, 
//    <{RouteSequence, bsCode, Distance}>

這個方法用於將值放入hashmap但是當我嘗試調用它時,我似乎無法從hashmap獲取任何值,總是存在nullpointerexception

List<String> sbsTest = new Vector<String>();
    sbsTest.add(0, "10");
    sbsTest.add(1, "1");
    System.out.println(sbsBusServiceData.get(sbsTest));
    try{
        List<String[]> sbsServiceResults = sbsBusServiceData.get(sbsTest);
        System.out.println(sbsServiceResults.size());
        String x = sbsServiceResults.get(1)[0];
        System.out.println(x);
    } catch(Exception e){
        System.out.println(txtR + "No data returned" + txtN + e);
    }

這是我從以下網址讀取數據的文件示例:

SBS

我怎樣才能讓hashmap返回我想要的值?

數組不適合作為HashMap的鍵,因為數組不會覆蓋ObjectequalshashCode方法(這意味着包含完全相同元素的兩個不同數組實例將被HashMap視為不同的鍵)。

替代方法是使用List<String>而不是String[]作為HashMap的鍵,或者使用TreeMap<String[]>和傳遞給構造函數的自定義Comparator<String[]>

如果您有固定的數組大小,那么我發布的示例可能很有用。 在這里,我創建了兩個對象,一個是Food,Next是Product。 這里使用Food對象並添加方法來獲取字符串數組。

public class Product {

private String productName;
private String productCode;

    public Product(String productName, String productCode) {
        this.productName = productName;
        this.productCode = productCode;
    }

    public String getProductName() {
        return productName;
    }
    public void setProductName(String productName) {
        this.productName = productName;
    }
    public String getProductCode() {
        return productCode;
    }
    public void setProductCode(String productCode) {
        this.productCode = productCode;
   }    
}

Food Model Class:用作Object而不是String []並實現String []功能。

public class Food implements Comparable<Food> {

private String type;
private String consumeApproach;

    public Food(String type, String consumeApproach) {
        this.type = type;
        this.consumeApproach = consumeApproach;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getConsumeApproach() {
        return consumeApproach;
    }

    public void setConsumeApproach(String consumeApproach) {
        this.consumeApproach = consumeApproach;
    }

    public String[] FoodArray() {
        return new String[] { this.type, this.consumeApproach };
    }
//Implement compareTo method as you want.
    @Override
    public int compareTo(Food o) {
        return o.getType().compareTo(this.type);
    }
}

使用HashMap示例

public class HashMapKeyAsArray {

public static void main(String[] args) {
    HashMap<Food,List<Product>> map = dataSetLake();
    map.entrySet().stream().forEach(m -> {
        String[] food = m.getKey().FoodArray();
        Arrays.asList(food).stream().forEach(f->{
            System.out.print(f + "       ");
        });
        System.out.println();
        List<Product> list = m.getValue();
        list.stream().forEach(e -> {
            System.out.println("Name:" + e.getProductName() + "     Produc Code:" + e.getProductCode());
        });
        System.out.println();
    });
}

private static HashMap<Food,List<Product>> dataSetLake(){
    HashMap<Food,List<Product>> data = new HashMap<>();

    List<Product> fruitA = new ArrayList<>();

    fruitA.add(new Product("Apple","123"));
    fruitA.add(new Product("Banana","456"));
    List<Product> vegetableA = new ArrayList<>();
    vegetableA.add(new Product("Potato","999"));
    vegetableA.add(new Product("Tomato","987"));

    List<Product> fruitB = new ArrayList<>();

    fruitB.add(new Product("Apple","123"));
    fruitB.add(new Product("Banana","456"));
    List<Product> vegetableB = new ArrayList<>();
    vegetableB.add(new Product("Potato","999"));
    vegetableB.add(new Product("Tomato","987"));

    Food foodA = new Food("Fruits","Read To Eat");
    Food foodB = new Food("Vegetables","Need To Cook");
    Food foodC = new Food("VegetablesC","Need To Cook C");


    data.put(foodA, fruitB);
    data.put(foodB, vegetableB);

    data.put(foodA, fruitA);
    data.put(foodC, vegetableA);

    return data;
}

使用TreeMap示例

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.TreeMap;

public class TreeMapKeyAsArray {
    public static void main(String[] args) {
        TreeMap<Food, List<Product>> map = dataSetLake();
        map.entrySet().stream().forEach(m -> {
        String[] food = m.getKey().FoodArray();
        Arrays.asList(food).stream().forEach(f->{
            System.out.print(f + "       ");
        });
        System.out.println();
        List<Product> list = m.getValue();
        list.stream().forEach(e -> {
            System.out.println("Name:" + e.getProductName() + "     Produc Code:" + e.getProductCode());
        });
        System.out.println();
    });
}

private static TreeMap<Food, List<Product>> dataSetLake() {
    TreeMap<Food, List<Product>> data = new TreeMap<>();

    List<Product> fruitA = new ArrayList<>();

    fruitA.add(new Product("Apple", "123"));
    fruitA.add(new Product("Banana", "456"));
    List<Product> vegetableA = new ArrayList<>();
    vegetableA.add(new Product("Potato", "999"));
    vegetableA.add(new Product("Tomato", "987"));

    List<Product> fruitB = new ArrayList<>();

    fruitB.add(new Product("Apple", "123"));
    fruitB.add(new Product("Banana", "456"));
    List<Product> vegetableB = new ArrayList<>();
    vegetableB.add(new Product("Potato", "999"));
    vegetableB.add(new Product("Tomato", "987"));

    Food foodA = new Food("Fruits", "Read To Eat");
    Food foodB = new Food("Vegetables", "Need To Cook");

    data.put(foodA, fruitB);
    data.put(foodB, vegetableB);

    data.put(foodA, fruitA);
    data.put(foodB, vegetableA);
    return data;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM