从字符串数组列表创建子字符串

时间:2016-07-31 12:15:16

标签: java string java.util.scanner

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

我是11111,  你-22222,  we-33333,  us-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));
            }
        }
}

我收到错误,原因是什么

  

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

6 个答案:

答案 0 :(得分:1)

您可以尝试这种方式:

import static org.codehaus.groovy.ast.ClassHelper.make
import static org.codehaus.groovy.ast.tools.GenericsUtils.makeClassSafeWithGenerics

...

ClassNode hashSet = makeClassSafeWithGenerics(HashSet, make(Long))

答案 1 :(得分:0)

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

@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,如果同名的多个数字可能)并围绕此数据结构构建代码。

答案 2 :(得分:0)

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

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));
    }
}

答案 3 :(得分:0)

这是工作解决方案

   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!");

        }
    }
}

答案 4 :(得分:0)

您尚未提供从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");
        }

    }
}

答案 5 :(得分:0)

subString方法的起始索引和lastIndex在哪里。 看看这个工作正常。

 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;
        }
    }
}