- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有 2 个 SortedDictionary“mainsd”&&“valuesd”。我正在尝试编程的条件如下:
If the sum of Values of the 2 Keys above the MaxValue in "mainsd" isgreater than or equal to the sum of Values of the 2 Keys below theMaxValue in "mainsd"
Then: Add the 2 KeyValuePairs above the MaxValue to "valuesd"
Else: Add the 2 KeyValuePairs below the MaxValue to "valuesd"
Keep Adding until valuesd.Values.Sum() reaches 50% of mainsd.Values.Sum()
换句话说,比较高于和低于最大值的 2 个值,以较大者为准添加到 valuesd 并扩展,直到我们达到 mainsd 总值的 50%。
"mainsd" contains the following
{
Key , Value
500.10 , 500
500.09 , 1000
500.08 , 2000
500.07 , 3000
500.06 , 4500 --------> Step 6: 4500+5500 > 5000+4000 (Add 500.05 & 500.06 to "valuesd")
500.05 , 5500
500.04 , 6000 --------> Step 5: 6000+7000 > 5000+4000 (Add 500.03 & 500.04 to "valuesd")
500.03 , 7000
500.02 , 8500 --------> Step 2: 8500+9500 > 9000+8000 (Add 500.01&500.02 to "valuesd")
500.01 , 9500
500.00 , 10000 -------> Step 1: Max Value (Add to "valuesd")
499.99 , 9000
499.98 , 8000 --------> Step 3: 9000+8000 > 7000+6000 (Add 499.99 & 499.98 to "valuesd")
499.97 , 7500
499.96 , 6500 --------> Step 4: 6500+7500 > 6000+7000 (Add 499.97 & 499.96 to "valuesd")
499.95 , 5000
499.94 , 4000--------> Step 7: 4000+3500 > 3000+2000 (Add 499.94 & 499.95 to "valuesd")
499.93 , 3500
499.92 , 2500
499.91 , 1500
499.90 , 550
}
Keep going until 50% is reached.
这是我得到的,但没有产生预期的结果。
mainsd = new SortedDictionary<double,int>();
valuesd = new SortedDictionary<double,int>();
if (!valuesd.ContainsKey(mainsd.Values.Max()))
{
valuesd.Clear();
valuesd.Add(mainsd.FirstOrDefault(x => x.Value == (mainsd.Values.Max()).Key),(mainsd.Values.Max()))
}
var vhi = valuesd.Keys.First();
var vlo = valuesd.Keys.Last();
double u1 = vhi+0.01;
double u2 = vhi+0.02;
double d1 = vlo+0.01;
double d2 = vlo+0.02;
if (mainsd.ContainsKey(u1) && mainsd.ContainsKey(u2))
{
int up1 = mainsd[u1];
int up2 = mainsd[u2];
}
if (mainsd.ContainsKey(d1) && mainsd.ContainsKey(d2))
{
int dn1 = mainsd[d1];
int dn2 = mainsd[d2];
}
if (valuesd.Values.Sum()/mainsd.Values.Sum() < 0.5)
{
if (up1+up2>=dn1+dn2 && !valuesd.ContainsKey(u1) && !valuesd.ContainsKey(u2))
{
valuesd.Add(u1,up1);
valuesd.Add(u2,up2);
}
else if (up1+up2<dn1+dn2 && !valuesd.ContainsKey(l1) && !valuesd.ContainsKey(l2))
{
valuesd.Add(d1,dn1);
valuesd.Add(d2,dn2);
}
}
Print("Hi="+valuesd.Keys.First()+"Lo="+valuesd.Keys.Last());
如果最大值为 500。
Output:Hi=500.01 Lo=499.99
非常感谢任何帮助。
最佳答案
这里是一个不完整的尝试,使用LINQ获取两个序列,一个用于向前枚举(从最大项开始),一个用于向后枚举。在那之后,继续使用 LINQ 并不容易,因为必须以复杂的方式并行枚举这两个序列,所以我使用了 while 循环。
var mainsd = new SortedDictionary<double, int>()
{
{500.10, 500}, {500.09, 1000}, {500.08, 2000}, {500.07, 3000},
{500.06, 4500}, {500.05, 5500}, {500.04, 6000}, {500.03, 7000},
{500.02, 8500}, {500.01, 9500}, {500.00, 10000}, {499.99, 9000},
{499.98, 8000}, {499.97, 7500}, {499.96, 6500}, {499.95, 5000},
{499.94, 4000}, {499.93, 3500}, {499.92, 2500}, {499.91, 1500},
{499.90, 550},
};
var maxValue = mainsd.Max(e => e.Value);
var maxItemKey = mainsd.First(e => e.Value == maxValue).Key;
var forward = mainsd.SkipWhile(e => e.Key <= maxItemKey).ToArray();
var backward = mainsd.TakeWhile(e => e.Key < maxItemKey).Reverse().ToArray();
int i1 = 0;
int i2 = 0;
while (true)
{
var sum1 = i1 < forward.Length - 1 ? forward[i1].Value + forward[i1 + 1].Value : 0;
var sum2 = i2 < backward.Length - 1 ? backward[i2].Value + backward[i2 + 1].Value : 0;
if (sum1 == 0 && sum2 == 0) break;
if (sum1 >= sum2)
{
Console.WriteLine($"Forward: {sum1}, Keys: {forward[i1].Key}, {forward[i1 + 1].Key}");
i1 += 2;
}
else
{
Console.WriteLine($"Backward: {sum2}, Keys: {backward[i2 + 1].Key}, {backward[i2].Key}");
i2 += 2;
}
}
输出:
Forward: 18000, Keys: 500,01, 500,02
Backward: 17000, Keys: 499,98, 499,99
Backward: 14000, Keys: 499,96, 499,97
Forward: 13000, Keys: 500,03, 500,04
Forward: 10000, Keys: 500,05, 500,06
Backward: 9000, Keys: 499,94, 499,95
Backward: 6000, Keys: 499,92, 499,93
Forward: 5000, Keys: 500,07, 500,08
Backward: 2050, Keys: 499,9, 499,91
Forward: 1500, Keys: 500,09, 500,1
更新:这是完成该程序所缺少的。在进入 while
循环之前,我们创建了 valuesd
字典:
var valuesd = new SortedDictionary<double, int>();
在while
循环中有两种情况。如果 sum1 >= sum2
我们从前向列表中添加两个条目:
valuesd.Add(forward[i1].Key, forward[i1].Value);
valuesd.Add(forward[i1 + 1].Key, forward[i1 + 1].Value);
否则 (else
) 我们从后向列表中添加两个条目:
valuesd.Add(backward[i2].Key, backward[i2].Value);
valuesd.Add(backward[i2 + 1].Key, backward[i2 + 1].Value);
在 while
循环结束时,我们检查是否达到了 50% 的目标。如果我们这样做,是时候通过调用 break
退出循环了。
if (valuesd.Values.Sum() >= mainsd.Values.Sum() * 50 / 100) break;
退出循环后,valuesd
字典将填充所需的条目。
关于c# - 如何比较一个 SortedDictionary 中的值以将它们添加到新的 SortedDictionary?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55770318/
我想使用 NetworkX Graph 对象作为 Python dict 中的键。但是,我不希望默认的比较行为(即通过对象的地址)。相反,我希望同构图是 dict 中相同元素的键。 此行为是否已在某处
这个问题已经有答案了: What is the most effective way for float and double comparison? (33 个回答) 已关闭 7 年前。 在您认为我
我正在学习 C 编程,为了练习,我找到了一个需要解决的任务。这有点像一个游戏,有人选择一个单词,其他人猜测字母。我必须检查有多少给定的单词可能是所选单词的正确答案。 输入: 3 3//数字 n 和 m
我两天前开始学习C,在做作业时遇到了问题。我们的目的是从字符数组中获取字符列表,并通过计算连续字符并将其替换为数字来缩短它。对“a4b5c5”说“aaaabbbbbccccc”。这是我到目前为止的代码
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
为什么我在 if 中的比较不起作用?答案应该是 8 但它返回 0。 function findMissing(missingArray){ var getArray = missing
我想知道为什么以下 JavaScript 比较会给出不同的结果。 (1==true==1) true (2==true==2) false (0==false==0) false (0==false)
我想知道是否有人可以帮助我完成这个程序。编写一个接受两个字符串的函数。该函数应该将这两个字符串与字典顺序上排在第一位的字符串组合起来。两个字符串之间应该有一个空格。在一行上打印结果字符串。在一行上打印
有谁知道一个免费的开源库(实用程序类),它允许您比较一个 Java bean 的两个实例并返回一个属性列表/数组,这两个实例的值不同?请发布一个小样本。 干杯 托马斯 最佳答案 BeanCompara
我是java新手。任何人都可以给出以下类声明的含义 public class ListNode, V> { K key; V value; ListNode next;
我需要用 C 语言计算和比较 3 种不同大小(100 * 100、1000 * 1000 和 10000 * 10000)的 2 个矩阵相乘的执行时间。我编写了以下简单代码来为 1000 * 1000
当我在 ACCESS 2007 中运行以下 SQL 时 Select Location, COUNT(ApartmentBuildings) AS TotalIBuildingsManaged Fro
根据我对互斥锁的了解——它们通常提供对共享资源的锁定功能。因此,如果一个新线程想要访问这个锁定的共享资源——它要么退出,要么必须不断轮询锁(并在等待锁时浪费处理器周期)。 但是,监视器具有条件变量,它
通常在编程中,不应该比较浮点数据类型是否相等,因为存储的值通常是近似值。 由于两个非整数 Oracle NUMBER 值的存储方式不同(以 10 为基数),是否可以可靠地比较它们是否相等? 最佳答案
使用 PowerShell 时,我们偶尔会比较不同类型的对象。一个常见的场景是 $int -eq $bool (即其中 0 -eq $false 、 0 -ne $true 和任何非零值仅等于真,但不
#include #define MAX 1000 void any(char s1[], char s2[], char s3[]); int main() { char string1[
我想比较两个日期。 从这两个日期中,我只使用 ToShortDateString() 获取日期组件, 如下所示。现在的问题是当我比较两个日期时。它的 throw 错误—— "Operator >= c
用户输入一个数字( float 或整数),并且它必须大于下限。 这是从 UITextField 获取数字的代码: NSNumberFormatter * f = [[NSNumberFormatter
我已经摆弄这段代码大约一个小时了,它让我难以置信。我认为解决方案相当简单,但我似乎无法弄清楚。无论如何,这里去。我制作了一个 javascript 函数来检查用户输入的字符,以便它只能接受 7 个字符
我不太明白为什么当我们在不覆盖 equals 的情况下比较具有相同类属性的两个实例时方法,它将给出 false .但它会给出 true当我们比较一个案例类的两个实例时。例如 class A(val
我是一名优秀的程序员,十分优秀!