【问题标题】:How to change values using arrays/arraylists to asteriks如何使用数组/数组列表将值更改为星号
【发布时间】:2016-03-25 02:17:44
【问题描述】:

我对 Java 很陌生,我正在尝试使用数组和数组列表编写一个程序,您可以在其中输入任意数量的值,并使用星号输出两个参数之间的值。 例如:

[5,14,23,43,54,15]
1-10: *
11-20: **
21-30:*
31-40: 
41-50:*
51-60: *

等等。这是我到目前为止所拥有的,但我遇到了错误和超出范围的异常。谁能说我是否走在正确的轨道上?任何帮助表示赞赏!

package arraylists;

import java.util.ArrayList;
import java.util.Scanner;

public class numberslists {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner reader = new Scanner(System.in);
        ArrayList numbers = new ArrayList();
        int [] number = new int[10];
        int x, count = 0;
        System.out.println("how many numbers would you like?");
        count = reader.nextInt();
        System.out.println("enter in those numbers please");
        for (x=0; x < count; x++){
            number[x] = reader.nextInt();
            numbers.add(number[x]);
        }
        System.out.println(numbers);
        int x10 = numbers.indexOf(number[x] < 10);
        numbers.remove(x10);
        System.out.println(numbers);
    }
}

【问题讨论】:

  • 从异常中查看堆栈跟踪。它将识别导致问题的代码行。然后看看这行代码,问问自己那行有什么问题。 (提示:循环退出后x 的值是多少?)另外,由于您使用的是原始ArrayList,因此您错过了一些非常有用的编译器反馈。 (例如,number[x] &lt; 10 是一个布尔值,但您没有将任何Boolean 对象放入numbers。)
  • 你说它计算两个参数之间有多少个值。您在哪里输入或设置您所说的 2 个参数?

标签: java arrays arraylist


【解决方案1】:

简而言之,正如拉希鲁所说,你需要换行:int x10 = numbers.indexOf(number[x] &lt; 10);

您的代码的主要问题是表达式number[x] &lt; 10 返回一个布尔值(真或假)。因此numbers.indexOf(number[x] &lt; 10) 将返回 1 或 -1。

最后,当代码到达numbers.remove(x10); 并且如果为-1(表示假),那么您将获得java.lang.ArrayIndexOutOfBoundsException,因为没有办法执行numbers.remove(-1);。请参阅documentation

您的代码还有改进的余地。以下是您可以做什么的建议。但请在尝试修复自己的代码后查看此建议(这样您可以获得更好的学习体验)。

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class CountOcurrancesInArray {

    private static Scanner reader = new Scanner(System.in);
    private static List<Integer> numbers = new ArrayList<Integer>(); // Use generics when possible: <Integer>
    public static void main(String[] args) {
            int x, count = 0;
            System.out.println("how many numbers would you like?");
            count = reader.nextInt();
            System.out.println("enter in those numbers please");
            for (x=0; x < count; x++){
                // I don't see a need for this line. number[x] = reader.nextInt();
                numbers.add(reader.nextInt());
            }
            System.out.println(numbers);
            int[] comparingNumbers = requestComparingNubers();
            System.out.println("You entered these numbers: " + numbers);
            String matchingNumbers = checkForNumbersInTheList(comparingNumbers);
            System.out.println("Numbers between " + comparingNumbers[0] + "-" + comparingNumbers[1] + ":" + matchingNumbers);
    }

    /**
     * Counts how many entries are in the list between 'comparingNumbersInput'
     * @param comparingNumbersInput
     * @return number of entries as asterisks "*"
     */
    private static String checkForNumbersInTheList(int[] comparingNumbersInput) {
        String result = "";
        for(Integer i : numbers) {
            if (i >= comparingNumbersInput[0] && i <= comparingNumbersInput[1]) {
                result += "*";
            }
        }
        return result;
    }

    /**
     * Asks the user to enter 2 numbers to be compared against the all the numbers in the list.
     * @return returns a int[2] sorted ascendingly
     */
    private static int[] requestComparingNubers() {
        int [] result = new int[2];
        System.out.println("Counting how many numbers there are in between x and y.");
        System.out.println("What is the first number?");
        result[0]=reader.nextInt();
        System.out.println("What is the second number?");
        result[1]=reader.nextInt();
        // Sort comparingList
        if (result[0] > result[1]) {
            int temp = result[1];
            result[1] = result[0];
            result[0] = temp;
        }
        return result;
    }
}

【讨论】:

  • 这可能比原来的问题更灵活一点,但它确实有效!
  • 这不是他要求的,为什么只比较两个数字并要求用户输入?顺便说一句,您以低效的方式执行此任务。您可以在 1 个循环中完成所有操作。
  • @bedbad,正确,这就是为什么我说“还有改进的余地”。我试图呈现 OP 正在寻找的解决方案,同时呈现“一些”改进而不会造成太多混淆。
【解决方案2】:

从用户获取计数后声明数组。

int x, count = 0;
System.out.println("how many numbers would you like?");
count = reader.nextInt();
int [] number = new int[count];

还请查看导致错误的代码行。

【讨论】:

    【解决方案3】:

    对我来说,这作为 Map 更有意义,您可以在其中为输入数组中找到的每个范围存储一个计数器。现在这意味着您必须首先确定每个输入是否适合的范围,然后更新与该范围匹配的计数器。由于我们必须将范围计算为输出字符串,并且无论如何您都希望将计数器表示为星号字符串,将范围存储为Map.key 的字符串,将计数器存储为星号字符串作为@987654322 @ 效果很好。

    这里有一些示例代码,其中数字是用户输入的原始值的ArrayList

      //Declare a Map that stores the range as a String ( "01-10") as the key 
      //and a counter in astericks as the value
      Map<String,String> counters = new HashMap<>();
    
      //Loop over the array ov values
      for(Integer value: numbers){
        //For each value calculate the diviser by diving by 10
        Integer lowRange = value / 10;
        //To get the low range, multiply the diviser by 10 and add 1
        lowRange = (10 * lowRange) + 1;
        //The high range is 9 mor ethan the low range
        Integer highRange = lowRange + 9;
        //Finally calcualte what the range looks like as a String
        //Note that it handles "1" as a special case by prepending a "0" to make the value "01"
        String rangeString = ((lowRange < 10) ? "0" + lowRange : lowRange) + "-" + highRange;
    
        //Now check the map to see if the rangeString exists as a key, meaning 
        //we have previously found a value in the same range 
        String count = "";
        if(counters.containsKey(rangeString)){
          //If we found the same range, get the previous count
          count = counters.get(rangeString);
        }
    
        //Place the count back into the map keyed off of the range and add an asterick to the count String
        counters.put(rangeString, count + "*");
      }
    
      //Finally iterate over all keys in the map, printing the results of the counters for each
      for(String range: counters.keySet()){
         System.out.println(range + " " + counters.get(range));
      }
    

    作为输出示例,如果用户输入值:

    [5,14,23,43,54,15,41]

    输出将是:

    01-10 *
    11-20 **
    41-50 **
    51-60 *
    21-30 *
    

    【讨论】:

    • 如果输出行的顺序很重要,请考虑使用有序映射。 TreeMap(而不是上面的 HashMap)就是这样一种实现。
    【解决方案4】:

    Java 数组是从零开始的索引。例如,如果您声明一个包含 10 个元素的数组,则这些元素的索引将从 0 到 9。

    在下面的代码 sn-p 中,当 java 完成“for”循环时

      for (x=0; x < count; x++){
        number[x] = reader.nextInt();
        numbers.add(number[x]);
    }
    

    x 变量的值将等于您输入到数字数组中的元素数(x = count)。

    所以,当你得到 x 位置的元素时,如下所示:

     int x10 = numbers.indexOf(number[x] < 10);
    

    如果 x

     numbers.remove(x10);
    

    如果 x >= 10,将在 number[x] 处发生 ArrayIndexOutOfBoundsException

    【讨论】:

      【解决方案5】:

      又一个家庭作业问题

      import java.util.ArrayList;
      import java.util.Scanner;
      import java.util.*;
      
      public class numberlists {
      
          public static void main(String[] args) {
              // TODO Auto-generated method stub
              Scanner reader = new Scanner(System.in);
              LinkedList < Integer > numbers = new LinkedList < Integer > ();
              //int [] number = new int[10]; no need, and the input is variable size
              int x, count = 0;
              System.out.println("how many numbers would you like?");
              count = reader.nextInt();
              System.out.println("enter in those numbers please");
              Map < Integer, Integer > range_numbers = new HashMap < Integer, Integer > ();
      
      
              for (x = 0; x < count; x++) {
                  //number[x] = reader.nextInt();   no need
                  numbers.add(reader.nextInt());
                  int rs = ((int) numbers.getLast() / 10) * 10 + 1; //range start for number i.e rs(15)=11
                  if (!range_numbers.containsKey(rs)) { //check if has number in that range
                      range_numbers.put(rs, 1);
                  } else { //gets the prev count, add 1 and stores back for range
                      range_numbers.put(rs, range_numbers.get(rs) + 1);
                  }
      
              }
      
              System.out.println(numbers);
              Map < Integer, Integer > sortedpairs = new TreeMap < Integer, Integer > (range_numbers); // need to sort
      
              for (Map.Entry < Integer, Integer > pair: sortedpairs.entrySet()) {
                  System.out.printf("\n%d-%d: %s", pair.getKey(), pair.getKey() + 9,
                      new String(new char[pair.getValue()]).replace("\0", "*"));
                  //little trick to repeat any string n times
              }
      
          }
      }
      

      享受吧。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-27
        • 2019-02-21
        相关资源
        最近更新 更多