【问题标题】:How to split string provided as user enter in java?java - 如何拆分用户在java中输入时提供的字符串?
【发布时间】:2019-02-20 16:24:56
【问题描述】:

如何拆分用户作为输入提供的carcolor 中的type

输入格式为:

<Type>#<Color>

输出将显示有多少类型的汽车具有相同的color

输入示例:

how many cars : 10
sedan#red
truck#yellow
van#white
suv#black
sedan#black
roadster#red
suv#gray
coupe#gray
minivan#white
truck#red

输出必须按字母顺序排序

black 2
gray 2
red 3
white 2
yellow 1

尝试了一个示例代码,仍然没有完成,但是对于如何拆分数组T^T

Class1

 public class Class1 {

    private String type ;
    private String color;
    private String format;

    public Class1() {
        this.type = "";
        this.color = "";
        this.format = "";
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public String getFormat() {
        return format;
    }

    public void setFormat(String format) {
        this.format = format;
    }

    public void split () {  
        String part[] = format.split("#");
        setType(part[0]);
        setColor(part[1]); // i don't know if this will work or not.. 
    } 
}

Class2

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Class2 {


    public static void main(String[] args) throws NumberFormatException, IOException {
        // TODO Auto-generated method stub
        int n ;
        String format ;

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        n = Integer.parseInt(br.readLine());

        Class1 [] dataArray = new Class1[n] ;
        Class1 data = new Class1();

        for(int a = 0 ; a <= dataArray.length ; a++) {
            dataArray[a] = data;
            data.setFormat(br.readLine());

            data.split();
            data.getType();
            data.getColor();
        }
    }
}

编码还没完成,还不知道怎么拆分数组。请帮我解决这个问题!

【问题讨论】:

  • 如果您的输入严格来说是type#color,则只需检查str.indexOf("#color") 和count++ 是否为相同颜色。
  • 你试过运行这个sn-p吗?它产生了错误的结果吗?
  • 旁注:如果您将 Class1 重命名为 Car 并将 Class2 重命名为 CarColorCounter,您的代码会更容易理解。不过,其余的看起来已经很棒了。

标签: java arrays sorting input split


【解决方案1】:

在 for 循环内初始化新对象 Class1 data = new Class1();,而不是在循环外初始化,否则每次循环运行时它都会被覆盖。

还遍历a &lt; dataArray.length 而不是a &lt;= dataArray.length

我添加了groupingBy 以获取按颜色名称分组的计数。然后我对生成的Map&lt;String, Integer&gt; 中的entrySet 进行排序并打印出内容。

我没有过多修改你的代码就达到了预期的输出。

public static void main(String[] args){
    try{
        int numberOfCars;
        String format ;
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        numberOfCars = Integer.parseInt(br.readLine());
        Class1 [] dataArray = new Class1[numberOfCars] ;

        for(int a = 0 ; a < dataArray.length ; a++) {
            //Initializing new instance everytime
            Class1 data = new Class1();
            data.setFormat(br.readLine());
            data.split();
            dataArray[a] = data;
        }
        //Creating a Stream of Class1 objects
        Arrays.stream(dataArray)
              .collect(Collectors.groupingBy(car -> car.getColor(), Collectors.counting()))
              .entrySet() //Getting entries from Map
              .stream() //sorting after the Map is created to preserve the sorted order
              .sorted(Comparator.comparing(entry -> entry.getKey())) //Sorting by key, that is the Color property of Class1
              .forEach((entry) -> System.out.println(entry.getKey() + " "+ entry.getValue()));
        }catch (NumberFormatException | IOException | ArrayIndexOutOfBoundsException e) {
              System.out.println("Error occurred try again");
              e.printStackTrace();
        }
}

【讨论】:

    【解决方案2】:

    从此更改您的 for 循环:

       for(int a = 0 ; a <= dataArray.length ; a++) {
            dataArray[a] = data;
            data.setFormat(br.readLine());
    
            data.split();
            data.getType();
            data.getColor();
        }
    

    到这里:

        for(int a = 0 ; a < dataArray.length ; a++) {
            Class1 data = new Class1();
            dataArray[a] = data;
            data.setFormat(br.readLine());
    
            data.split();
            data.getType();
            data.getColor();
        }
    

    两个重要的变化是:

    1. 你应该只在a &lt; dataArray.length时循环,否则 当a == dataArray.length 时,你会得到一个ArrayIndexOutOfBoundsException

    2. 每次读入时都需要创建Class1 的新实例 一个新行,并存储在您的dataArraya 位置

    除此之外,它看起来还不错。显然,您的设计中有一些小问题——也许setFormat 应该调用split,而不是需要单独调用? - 但您现在应该能够遍历dataArray 并计算颜色,可能使用Map&lt;String, Integer&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-29
      相关资源
      最近更新 更多