【问题标题】:creating a sub string from a string array-list从字符串数组列表创建子字符串
【发布时间】:2016-07-31 12:15:16
【问题描述】:

我有一个包含姓名和电话号码的文本文件,格式如下:

我-11111 , 你-22222 , 我们-33333 , 我们-44444 , 他们-55555,

在将上述内容存储在数组列表中之后,我想创建一个方法,该方法首先要求用户输入名称,然后检查该名称是否存在。如果是,则打印出对应的编号。

这是我所拥有的:

public static void search () {
        String wanted;
        System.out.println("Give a neme: ");
        wanted = scan.nextLine();
        for (int i = 0; i < list.size() - 1 ; i++)
        { 
            // here I'm trying to separate the names in the array-list
            // if it matches "wanted" print it out
            if (wanted.equals(list.get(i).substring(' ', ','))) {
                System.out.println("names: " + list.get(i));
            }
        }
}

我收到这个错误,是什么原因

线程“主”java.lang.StringIndexOutOfBoundsException 中的异常: 字符串索引超出范围:44

【问题讨论】:

  • 在阅读时将其转换为Map&lt;String, String&gt;,您的问题就解决了。
  • 谢谢,你能详细说明一下
  • 这样的子串方法有这些参数存在吗?substring(' ', ',')

标签: java string java.util.scanner


【解决方案1】:

你可以试试这个方法:

Map<String, String> users = new HashMap<>();
// here when read every line from file, split the line with "-"
// and store it in the map
String[] strs = line.split("-");
users.put(strs[0], strs[1]);

// then when you check, you can do as below
if (users.containsKey(name)) {
    System.out.println("Phone: "+users.get(name));
}

【讨论】:

  • 感谢您的回答。 “line”是一个字符串作为上面问题中的行吗?
【解决方案2】:

这是可行的解决方案

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

public class FindString {
    public static List<String> names = new ArrayList<String>();
    public static Scanner scanner = new Scanner(System.in);
    public static void main(String[] args) {
        names.add("me-22222");
        names.add("us-33333");
        names.add("you-44444");
        names.add("they-55555");

        System.out.println("Enter name: ");
        String toCheck = scanner.next();

        for(String s : names) {
            String[] parts = s.split("-");
            String name = parts[0]; 
            int number = Integer.parseInt(parts[1]);
            if(toCheck.equals(name))
                System.out.println("This name already got a number : " + number);
            else 
                System.out.println("There is no number connected with this name!");

        }
    }
}

【讨论】:

  • 扫描仪会要求您输入 3 次。更改该数字,您将看到差异。让我知道你是否得到它! @zamzam
  • 这是一个不错的教程,但不是我想要的。我已经有了问题中提到的姓名和数字列表。现在我想要求用户输入一个姓名,如果该姓名与列表中的任何姓名匹配,则打印出他们的号码。
  • 但是与这些名称相关的数字是什么? @zamzam
  • 嗯,你知道你可能是对的,但我不明白你的解决方案。我的想法是遍历字符串数组列表,分离名称,看看它们是否与想要的名称匹配,如果是,然后在“-”之后打印出它们前面的数字
  • 这样可以吗? @zamzam
【解决方案3】:

当数据以有助于解决问题的方式表示时,大多数问题都会有一个非常简单的代码解决方案。在您的情况下,将数据表示为从名称到数字的Map&lt;String, String&gt;,检查是否存在和查找将是微不足道的:

@Test
public void test() {
    String data = "me-012345, them-543210";
    Map<String, String> name2number = new HashMap<>();
    for (String entry: data.split(", ")) {
        String[] pair = entry.split("-");
        name2number.put(pair[0], pair[1]);
    }

    System.out.println(name2number.get("me"));
    System.out.println(name2number.get("them"));
    System.out.println(name2number.get("somebody else"));
}

此测试打印:

012345
543210
null

本质上,当您以上述格式读入或加载数据时,立即解析它们,放入匹配的结构(MapMultiMap,如果可能有多个相同名称的数字)并构建您的代码围绕这个数据结构。

【讨论】:

    【解决方案4】:

    有很多方法可以做到这一点。根据您的简单方法,我将其更正如下:

    for (int i = 0; i < list.size()-1; i++) { 
        String temp = list.get(i);
        if (wanted.equals(temp.substring(0, temp.indexOf('-')))) {
            System.out.println("names: " + list.get(i));
        }
    }
    

    【讨论】:

      【解决方案5】:

      subString 方法的开始索引和最后索引在哪里。 看看这个效果很好。

       public static void main(String[] args){
          nameList = new ArrayList<>();
          populateNameList();
          Scanner scanner = new Scanner(System.in);
          System.out.print("Name: ");
          String name = scanner.nextLine();
          search(name);
      }
      
      private static void populateNameList(){
          nameList.add("me-11111");
          nameList.add("you-22222");
          nameList.add("we-33333");
          nameList.add("us-44444");
      }
      
       private static void search(String name){
          for (int i = 0; i < nameList.size(); i++) {
              if(name.equalsIgnoreCase(nameList.get(i).substring(0,
                      nameList.get(i).indexOf("-")))){
                  System.out.println(nameList.get(i).substring(nameList.get(i).indexOf("-")+1));
                  break;
              }
          }
      }
      

      【讨论】:

        【解决方案6】:

        您尚未提供从 File 读取内容的代码。确保你在那部分做得对。我已经写了一个完整的演示供你参考。

        将用户的姓名和电话号码读入Map 是一种可理解的方式。无需自己编写循环来获取用户的电话号码,而是让Map 发送给您。

        请看下面的代码。

        import java.io.*;
        import java.util.*;
        
        public class Test3 {
            public static void main(String args[]){
                readFile();
                search();
            }
        
            static Scanner scan = new Scanner(System.in);
            static Map<String, String> map = new HashMap<String, String>();
        
            public static void readFile(){
                try{
                    BufferedReader br = new BufferedReader(new FileReader("file1"));
                    String line = br.readLine();
        
                    while(line != null){
                        String tokens[] = line.split(" ,");
                        for(String token: tokens){
                            String name = token.split("-")[0].trim();
                            String phoneNum = token.split("-")[1].trim();
                            map.put(name, phoneNum);
                        }
        
                        System.out.println(Arrays.toString(tokens));
                        System.out.println(map);
                        line = br.readLine();
                    }
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
        
            public static void search() {
                String wanted;
                System.out.println("Give a neme: ");
                wanted = scan.nextLine();
        
                if(map.get(wanted) != null){
                    System.out.println("names: " + map.get(wanted));
                }else{
                    System.out.println("Name is not existed");
                }
        
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2016-02-13
          • 2019-07-07
          • 2011-08-20
          • 1970-01-01
          • 1970-01-01
          • 2017-02-13
          • 1970-01-01
          • 1970-01-01
          • 2013-07-14
          相关资源
          最近更新 更多