簡體   English   中英

從受保護的方法java獲取hashmap值

[英]get hashmap value from protected method java

我是 Java 復雜概念的新手,我也知道這不是一個困難的問題,但我知道我犯了一些錯誤,這是我的類中的一個方法,我正在我的主要方法中提取它的值,但它顯示NaN這是方法:

protected static Map<String, Double> getSlaMetrics(List<Vm> vms) {
        Map<String, Double> metrics = new HashMap<String, Double>();
        List<Double> slaViolation = new LinkedList<Double>();
        double totalAllocated = 0;
        double totalRequested = 0;
        double totalUnderAllocatedDueToMigration = 0;

    for (Vm vm : vms) {
        double vmTotalAllocated = 0;
        double vmTotalRequested = 0;
        double vmUnderAllocatedDueToMigration = 0;
        double previousTime = -1;
        double previousAllocated = 0;
        double previousRequested = 0;
        boolean previousIsInMigration = false;

        for (VmStateHistoryEntry entry : vm.getStateHistory()) {
            if (previousTime != -1) {
                double timeDiff = entry.getTime() - previousTime;
                vmTotalAllocated += previousAllocated * timeDiff;
                vmTotalRequested += previousRequested * timeDiff;

                if (previousAllocated < previousRequested) {
                    slaViolation.add((previousRequested - previousAllocated) / previousRequested);
                    if (previousIsInMigration) {
                        vmUnderAllocatedDueToMigration += (previousRequested - previousAllocated)
                                * timeDiff;
                    }
                }
            }

            previousAllocated = entry.getAllocatedMips();
            previousRequested = entry.getRequestedMips();
            previousTime = entry.getTime();
            previousIsInMigration = entry.isInMigration();
        }

        totalAllocated += vmTotalAllocated;
        totalRequested += vmTotalRequested;
        totalUnderAllocatedDueToMigration += vmUnderAllocatedDueToMigration;
    }

    metrics.put("overall", (totalRequested - totalAllocated) / totalRequested);
    if (slaViolation.isEmpty()) {
        metrics.put("average", 0.);
    } else {
        metrics.put("average", MathUtil.mean(slaViolation));
    }
    metrics.put("underallocated_migration", totalUnderAllocatedDueToMigration / totalRequested);
    // metrics.put("sla_time_per_vm_with_migration", slaViolationTimePerVmWithMigration /
    // totalTime);
    // metrics.put("sla_time_per_vm_without_migration", slaViolationTimePerVmWithoutMigration /
    // totalTime);

    return metrics;
}

我正在嘗試通過以下代碼打印其值:

Map<String, Double> results = getSlaMetrics(vmList);
System.out.println("Overall Violations:" + results.get("overall"));

我知道這是一個基本問題,但請不要介意。

獲得NaN “非數字”意味着我們試圖將零除以零。 將非零數字除以零將導致-InfinityInfinity 我會看看這一行,並確保不要將數字除以零。

metrics.put("overall", (totalRequested - totalAllocated) / totalRequested);

正如 Ivan 在下面的評論中提到的,讓我們演示NaN-InfinityInfinity幾種情況

System.out.println(0.0/0.0);
System.out.println(0/0.0);
System.out.println(-1/0.0);
System.out.println(1/0.0);

它產生以下輸出:

NaN
NaN
-Infinity
Infinity

這里的實際問題不在於 Map 及其方法,而在於代碼。 如果您通過此代碼,則控件永遠不會轉到以下內容


if (previousTime != -1) {
                double timeDiff = entry.getTime() - previousTime;
                vmTotalAllocated += previousAllocated * timeDiff;
                vmTotalRequested += previousRequested * timeDiff;

                if (previousAllocated < previousRequested) {
                    slaViolation.add((previousRequested - previousAllocated) / previousRequested);
                    if (previousIsInMigration) {
                        vmUnderAllocatedDueToMigration += (previousRequested - previousAllocated)
                                * timeDiff;
                    }
                }

所以在以下分配中分配的值為零

         totalAllocated += vmTotalAllocated;          //  zero
        totalRequested += vmTotalRequested;           // zero
        totalUnderAllocatedDueToMigration += vmUnderAllocatedDueToMigration;  // zero

因此 Map 中的以下值是 0.0/ 0.0 即 NaN

 metrics.put("overall", (totalRequested - totalAllocated) / totalRequested); 

   // Value in Map for Key "overall" is ==> 0.0 - 0.0/0.0 = NaN

所以如果你在輸出中得到 NaN 也就不足為奇了。

暫無
暫無

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

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