当前位置: 首页 > 面试题库 >

Java中的基本方向算法

邹博裕
2023-03-14
问题内容

这个周末,我花了几分钟时间讨论一种算法,该算法将采用一个标题(以度为单位)并返回一个基数方向的String(我正在我使用的android指南针应用程序中使用它)。我最终得到的是:

private String headingToString(Float heading)
{
    String strHeading = "?";
    Hashtable<String, Float> cardinal = new Hashtable<String, Float>();
    cardinal.put("North_1", new Float(0));
    cardinal.put("Northeast", new Float(45));
    cardinal.put("East", new Float(90));
    cardinal.put("Southeast", new Float(135));
    cardinal.put("South", new Float(180));
    cardinal.put("Southwest", new Float(225));
    cardinal.put("West", new Float(270));
    cardinal.put("Northwest", new Float(315));
    cardinal.put("North_2", new Float(360));

    for (String key: cardinal.keySet())
    {
        Float value = cardinal.get(key);
        if (Math.abs(heading - value) < 30)
        {
            strHeading = key;
            if (key.contains("North_"))
            {
                strHeading = "North";
            }
            break;
        }
    }
    return strHeading;
}

我的问题是,这是最好的方法吗?尽管我还没有在网上搜索示例,但它必须做过很多次。是否有其他人尝试过此方法并找到了更整洁的解决方案?

编辑The Reverand’s Thilo’s,shinjin’s和Chrstoffer的回复:

解决方案

public static String headingToString2(double x)
{
    String directions[] = {"N", "NE", "E", "SE", "S", "SW", "W", "NW", "N"};
    return directions[ (int)Math.round((  ((double)x % 360) / 45)) ];
}

问题答案:

在大多数情况下,这很好,尽管要使其优化和(IMO)更加清洁,您可以做的是找到一个将输入标题与地图中使用的标题相关联的函数。

例如:(我很确定这是正确的,但是您需要检查一下)

45* (int)Math.round((  ((double)x % 360) / 45))

首先x % 360,要确保标题在有效范围内。然后

45 * round(.../45)

查找最接近的45的倍数。

现在将地图更改为

  HashMap<Integer, String> map = new HashMap<Integer, String>()
  map.put(0, "North")
  map.put(45, "Northeast")
  etc...

因此,现在您的算法成为一种快速的数学计算,而不是遍历整个地图。此外,这里不需要Hashtable,因为它提供了并发构造(如果我没记错的话),并且在您的情况下,这实际上会导致性能下降。

同样,对于您的需求,性能影响可能完全可以忽略不计。

编辑Thilo和shinjin的建议:

不用乘以45,只需保留方程式的其余部分,即为您提供0-7的值,并创建一个字符串数组。

String directions[] = {"N", "NE", "E", "SE", "S", "SW", "W", "NW"}
return directions[ (int)Math.round((  ((double)x % 360) / 45)) % 8 ]

并且您的问题已经两行解决了。

注意事项:负数不能正确使用模量。如果我们的输入标题为负,则需要首先使其为正。



 类似资料:
  • 问题内容: 我最近注意到Java关于Java基本算术运算的特质。用下面的代码 我收到“类型不匹配”的编译错误… 都是基本的算术运算在Java中(,,,)只能对原始数据类型进行和高阶(,,等),而在算术运算和是第一投地,然后评估? 问题答案: 上的操作,并且被加宽到除非编译器可以确定该值的范围。 但 BTW即使发生溢出也会编译。:]

  • 有人能彻底解释一下为什么这会打印21003和32103吗?我真的被这弄糊涂了。谢谢你!

  • 本文向大家介绍详解Java中实现SHA1与MD5加密算法的基本方法,包括了详解Java中实现SHA1与MD5加密算法的基本方法的使用技巧和注意事项,需要的朋友参考一下 SHA1 MD5 MD5(Message Digest Algorithm 5),即消息摘要算法第五版。消息摘要是一种算法:无论原始数据多长,消息摘要的结果都是固定长度的;是一种不可逆的算法 原始数据任意bit位的变化,都会导致消息

  • 问题内容: 我在使用Java中的基本递归问题时遇到了很多麻烦;任何指针都很棒。 “写一种静态递归方法来打印出几何序列的第n个项:2、6、18、54。” 据我所知,我应该在代码中的某处递归地将某物乘以3,但我一直在努力寻找方法。我知道我需要终止声明,但是何时发生?我需要帮手方法吗? 问题答案: 一个递归函数是一个函数,它的实现引用自身。以下是一些有趣的示例: 解决问题的方法: 编辑 : 上面的类使用

  • 本文向大家介绍详谈Java中的二进制及基本的位运算,包括了详谈Java中的二进制及基本的位运算的使用技巧和注意事项,需要的朋友参考一下 二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹发现。当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。计

  • 本文向大家介绍Kruskal算法的基本过程相关面试题,主要包含被问及Kruskal算法的基本过程时的应答技巧和注意事项,需要的朋友参考一下 参考回答: Kruskal算法是以边为主导地位,始终选取当前可用的拥有最小权值的边,所选择的边不能构成回路。首先构造一个只有n个顶点没有边的非连通图,给所有的边按值以从小到大的顺序排序,选择一个最小权值边,若该边的两个顶点在不同的连通分量上,加入到有效边中,否