![](/img/trans.png)
[英]java 8 - store method in HashMap and get return value from method in map
[英]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 “非數字”意味着我們試圖將零除以零。 將非零數字除以零將導致-Infinity
或Infinity
。 我會看看這一行,並確保不要將數字除以零。
metrics.put("overall", (totalRequested - totalAllocated) / totalRequested);
正如 Ivan 在下面的評論中提到的,讓我們演示NaN
、 -Infinity
和Infinity
幾種情況
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.