【问题标题】:How can I link two arrays, so that I'm able to get the value from the other array to use?如何链接两个数组,以便我能够从另一个数组中获取要使用的值?
【发布时间】:2020-03-07 15:56:16
【问题描述】:

我是一名 Java 初学者,这是针对我的软件课程的。一般项目非常简单,它要求您告诉用户他们的销售税是多少,以及他们的新总额是多少,基于他们所在的美国州。我试图在他们输入时做到这一点(通过扫描仪),例如,在“你在哪个州”提示之后的“威斯康星州”,我会得到“.05”的值来使用,因为那是威斯康星州的州税。

我已经制作了两个数组,但我只是不知道如何使用另一个数组中的值访问数组中的值。一切都按照正确的对应顺序排列,例如阿拉巴马州的税率是 4% (.04),阿拉斯加州的税率是 0%,以此类推。

import java.util.Scanner;

public class SalesTax {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        double sale;
        double salesTax;
        double total;

        double[] taxRate = { .04, 0, .56, .65, .75, 
        .29, .0635, 0, .06, .04, 
        .04, .06, .0625, .07, .06, 
        .065, .06, .04, .055, .06,
        .0625, .06, .06875, .07, .04225, 0, 
        .055, .0685, 0, .07, .05125, 
        .04, .0475, .05, .0575, .045, 
        0, .06, .07, .06, .04, 
        .07, .0625, .0595, .06, .0530, 
        .065, .06, .05, .04, .0575 };

        String[] states = { "Alabama", "Alaska", "Arizona", "Arkansas", "California", 
        "Colorado", "Connecticut", "Delaware", "Florida", "Georgia", 
        "Hawaii", "Idaho", "Illinois", "Indiana", "Iowa", 
        "Kansas", "Kentucky", "Louisiana", "Maine", "Maryland", 
        "Massachusetts", "Michigan", "Minnesota", "Mississippi", "Missouri", 
        "Montana", "Nebraska", "Nevada", "New Hampshire", "New Jersey", 
        "New Mexico", "New York", "North Carolina", "North Dakota", "Ohio", 
        "Oklahoma", "Oregon", "Pennsylvania", "Rhode Island", "South Carolina", 
        "South Dakota", "Tennessee", "Texas", "Utah", "Vermont", 
        "Virginia", "Washington", "West Virginia", "Wisconsin", "Wyoming" };

        System.out.println("Enter the state you are in (please type the full name): ");
        states = input.nextLine();

        System.out.println("Enter the amount of the sale: ");
        sale = input.nextDouble();
    }
}

我真的不知道从这里去哪里。一旦我能够引用该值,我应该能够轻松地对其其余部分进行编码。如果需要更多信息,请告诉我。

【问题讨论】:

    标签: java arrays


    【解决方案1】:

    前面的回答是正确的,但为此您需要绝对确保两个数组始终具有相同的大小,否则它将失败。 如果您不确定,可以使用HashMap<String, Double> map 从那里你可以做一个 `map.put("Alabama", 0.04);每个人都喜欢。 然后你可以遍历 map.keySet() ,当你找到想要的状态时,你只需执行 map.get(state)

    【讨论】:

    • 从 Java 9 开始,Map 接口具有 Map.ofEntriesMap.entry,可用于创建任意大小的不可修改的地图。
    • 没错,在循环时,如果你决定那样做,我认为从 Java 8 开始,地图有方法 entrySet,这种方式不是通过键循环,而是通过一个 Set 循环同时键和值,这样你就不需要再从键中查找值了
    • 抱歉,“循环遍历 map.keySet()”到底是什么意思?
    • 你可以这样做(假设你正在寻找例如俄勒冈州的税率): long taxRate; for (String key : map.keySet()) { if (key.equals("Oregon") { taxRate = map.get(key); } }
    【解决方案2】:

    您可以获取并保留所选状态的索引,然后直接使用它从数量中获取值。

    int index = -1;
    for (int i = 0; i < states.length; i++) {
        if (states[i].equals (chosenState)) {
           index = i;
           break;
        }
    }
    
    if (index >= 0) {
       tr = taxRate[index];  // is what you want
    }
    

    但可能更好但更高级的方法是创建一个包含名称和 taxRate 的类,并拥有这些对象的数组或列表

    【讨论】:

      【解决方案3】:

      您真正应该使用的是类似HashMap 的数据结构。它非常简单,基于@Scary Wombat's answer's second suggestion

      使用以下 2 个字段创建一个名为 Entry 的类:一个名为 stateString 字段和一个名为 taxRate 的类型为 double 的字段。

      创建另一个名为TaxRateTable 的类(或任何对你有意义的名称),并且只有一个字段,即Entry 类型的对象数组,即Entry 数组。

      您必须存储 50 个州的记录及其相应的税率。因此,数组大小为 67。现在我们需要做的就是找到一种方法,以这样的方式将 Entry 插入到数组中,当我正在寻找特定的 Entry >(当然在您的情况下是按名称),我们不使用循环导航到该位置,而是直接跳转到我们正在查找的条目的确切位置为。
      我们如何做到这一点? (这是解决方案的核心)
      我们创建了一个函数,它接收一个州的名称,然后输出一个介于 0 和 66(含)之间的数字,并且对于每个州的名称,它返回一个不同的数字(你能猜到我们要去哪里吗?)
      一旦我们得到数字,这个数字现在将成为数组中Entry 的索引。
      那么这个函数长什么样子呢?

      static int calculateIndex(String name) {
      int sumTotal = 0;
              for (int i = 0; i < name.length(); i++) {
                  sumTotal += name.charAt(i);
              }
      
              return ((13*sumTotal) % 127) % 67;
      }
      

      然后创建一个名为putTaxRateEntryOfState 的方法,它采用州名和税率。使用参数创建一个Entry 对象,使用上述函数找出索引,然后简单地将Entry 分配为Entry 数组中获得的索引处的值。

      现在创建一个名为getTaxRateOfState 的方法,该方法将状态名称作为唯一参数。通过调用上面提到的函数calculateIndex 获取存储条目在数组中的索引,然后使用该索引访问您在数组中查找的确切条目。

      说明
      使用的数据结构称为Hashtable。它可以找到一个给定的元素,也可以非常快地插入一个(在恒定时间内)。
      如您所见,数据结构中的项目没有排序。

      哈希表的大小(即Entry 数组的总大小)通常选择在1.3x larger the total number of values to be saved in the array 附近。这就是为什么在这种情况下它是 67,大约是 1.3x greater,而不是要输入的值的总数 50。

      calculateIndex 函数发生了什么?
      此函数称为hash function。有多种散列函数被设计用于各种需求。在我们的例子中,因为我们事先知道所有数据,所以我们使用称为Perfect Hash Function 的哈希函数。它主要用于事先知道所有输入的情况。
      它具有以下形式:

      索引 = (k*x mod p) mod n

      在这种情况下,我选择了 k = 13 和 p = 127(两个素数)。

      重要!
      哈希函数很可能为不同的值计算相同的索引。这被称为hash collision,这是正常的,你应该期待它。 resolve 这个有多种技术。

      但是,如果您不想执行上述所有操作而只是实现一次性解决方案,那么您可以使用 Java 的 HashMap class

      【讨论】:

        猜你喜欢
        • 2015-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-03
        • 1970-01-01
        相关资源
        最近更新 更多