0

我试图找出解决以下问题的最佳方法。

我需要在地图上绘制路线。我有一个有序的颜色池,我想从中挑选。如果第一种颜色可用(尚未使用),我想使用该颜色。如果使用第一种,我想使用第二种颜色,依此类推。另外,我画的路线可以分组。因此,如果组相同,它们可能会共享相同的颜色。

这是一个例子:

颜色列表(订单事项):蓝色,红色,绿色,黄色......

  • 第一条路线是A组。蓝色可用:BLUE
  • 第二条路线是 B 组。蓝色不可用。红色可用:RED
  • 第三条路线是 A 组。A 组已经在使用蓝色,所以使用:蓝色
  • 第二条路线被删除
  • 第四条路线是 C 组。蓝色不可用。红色可用:RED
  • 第五条路线是 D 组。蓝色和红色不可用。绿色可用:绿色

我正在讨论这种系统的最佳数据结构是什么。我需要维护颜色及其顺序,哪些组已“签出”颜色,以及何时可以将颜色“释放”回可用选择池中。

有什么建议么?

编辑:

我目前的策略是使用两种数据结构。首先是一个字典,其中键是组名,值是正在使用的颜色,所以我知道谁当前正在使用什么颜色。第二个结构将是一个堆栈,用于维护可用颜色的顺序。

所以当我想添加一个新的路由时,我首先去字典检查我的组名是否存在。如果是这样,我将使用指定的颜色。如果没有,我将从堆栈中提取下一个可用颜色,然后将我的组合添加到字典中。

与此相关的问题是,它不会使用颜色维护每个组中有多少条路线的计数。因此,假设我在 A 组中有两条使用蓝色的路线。我删除了一条路线。我如何知道是否还有其他 A 组路线仍在使用蓝色?我不知道我是否可以将蓝色放回堆栈。

4

2 回答 2

1

我的很相似。我可能应该清理它更多...

    class ColorAssigner
{
    public Dictionary<string, ColorGroupDetails> ColorAssignments { get; private set; }
    public SortedList<double, Color> Colors { get; private set; }

    public ColorAssigner()
    {
        ColorAssignments = new Dictionary<string, ColorGroupDetails>();
        Colors = new SortedList<double, Color>()  { { 1, Color.Blue}, {2, Color.Red}, {3,Color.Green}, {4,Color.Yellow} };
    }

    public Color RequestColor(string groupName)
    {
        if (ColorAssignments.ContainsKey(groupName)) 
        {
            ColorAssignments[groupName].Count++;
            return ColorAssignments[groupName].AssignedColor;
        }

        var assignedColor = GetNextAvailableColor();

        ColorAssignments.Add(groupName, new ColorGroupDetails() { Count = 1, AssignedColor = assignedColor });

        return assignedColor;
    }

    private Color GetNextAvailableColor()
    {
        var assignedColors = ColorAssignments.Select(a => a.Value.AssignedColor).ToList();

        return Colors.Values.Except(assignedColors).First();
    }

    public void ReleaseColor(string groupName)
    {
        if (ColorAssignments.ContainsKey(groupName))
        {
            var count = ColorAssignments[groupName].Count -= 1;

            if (count < 1) ColorAssignments.Remove(groupName);
        }
    }
}


    class ColorGroupDetails
    {
        public int Count { get; set; }
        public Color AssignedColor { get; set; }
    }
}
于 2013-02-27T19:16:57.080 回答
0

我能够使用 aDictionary和 a来实现这一点SortedList

internal class ColorUseCounter
{
    public ColorUseCounter(int ColorID, Color Color)
    {
        this.ColorID = ColorID;
        this.Color = Color;
        Count++;
    }

    public int ColorID { get; set; }
    public Color Color { get; set; }
    public int Count { get; set; }
}

private static Dictionary<double, ColorUseCounter> UsedColors = new Dictionary<double, ColorUseCounter>();
private static SortedList<int, Color> AvailableColors = new SortedList<int, Color>()
{
    { 1, Color.FromArgb(74, 117, 175) },
    { 2, Color.FromArgb(226, 134, 48) },
    { 3, Color.FromArgb(94, 158, 64) },
    { 4, Color.FromArgb(185, 58, 46) },
    ...
    ...
};

键控在 GroupID 上,在我的Dictionary情况下是双精度。因此,当我有绘制路线时,我首先检查我的 GroupID 是否在我的Dictionary. 如果是,我使用该颜色作为我的路线并将 1 增加,Count以便我知道有多少路线正在使用它Color

如果我的 GroupID 不在 中Dictionary,我会转到SortedList使用 的优先级Colors作为键的我的。所以我抓住了第一个项目SortedList并将其添加到Dictionary我的 GroupID 旁边。Color然后我从中删除它,SortedList因为它不再可用。

当我删除一条路线时,我只需检查Dictionary是否Count已归零。如果是这样,我删除Dictionary条目并将其重新插入ColorSortedList.

工作很棒。

于 2013-02-27T18:39:47.287 回答