在迭代链接列表上使用拆分器



只是想知道您是否可以使用拆分器类来拆分从 LinkedList 移动到迭代列表的详细信息?这是我在迭代 LinkedList 之前使用的初始拆分代码:

    Scanner input = new Scanner(new File("today.txt"));
        while (input.hasNextLine())
        { 
            names = input.nextLine();
            if(names.contains(":"))
                {
                    splitter2 = names.split(":");
                    name = splitter2[0];
                    times = splitter2[1];
                    System.out.printf("%stt %s n",name, times);
                }
            q1.add(names);  
        }

Q1是我创建的链接列表。有没有办法拆分迭代列表,以便我在回调新的迭代列表时只能搜索名称?

如果我理解正确,地图比链接列表更适合您的需求。

您可以有一个Map<String,String>,其中键name,值times。或者,您可以有一个Map<String,SomeObject>,其中键是包含您从行中读取的数据的某个对象的名称和值。

然后q1.add(names),您可以拥有:

Map<String,String> map = new HashMap<>();
...
while (input.hasNextLine()) {
    ...
    map.put (name,times);
    ...
}

Map<String,SomeObject> map = new HashMap<>();
...
while (input.hasNextLine()) {
    ...
    map.put (name,new SomeObject(name,times);
    ...
}

稍后,您可以在地图中搜索特定名称(map.containsKey(name)map.get(name)),或遍历所有名称(使用 map.keySet() )。

有点不清楚,但我认为你要找的是一个HashMap。如果想法是将名称和时间放入数据结构中,以便以后可以按名称搜索,那么您需要一个HashMap<String,String> map,然后

map.put(name,times);

以添加到地图。稍后,您可以使用以下命令检索特定名称的时间

map.get(name);

这里有一些假设:

  1. 你不关心名字的顺序(如果你关心,请参阅LinkedHashMap)。
  2. 这些名称是唯一的(如果它们不是唯一的,请参阅番石榴的Multimap)。

您可以创建自定义Class,将q1更改为此type的列表,如果可以split元素,请添加元素。

final List<Person> q1=new LinkedList<Person>();
{...other code...}
//your code change to add to this list when split can occur  
if(names.contains(":"))
{
    splitter2 = names.split(":");
    name = splitter2[0];
    times = splitter2[1];
    System.out.printf("%stt %s n",name, times);
    q1.add(new Person(name,times); 
}

然后,您可以迭代list并将属性namesearch key进行比较:

final String searchKey="george";
for(final Person person : q1){
    if(person.getName().equalsIgnoreCase(searchKey))
       System.out.println("I found " + searchKey +"!");
}

人员类:

public class Person {
    private String name;
    private String time;
    public Person(String name, String time) {
        this.name = name;
        this.time = time;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setTime(String time) {
        this.time = time;
    }
    public String getTime() {
        return time;
    }
}

或者,您可以在迭代期间仅list迭代和拆分字符串,方法与以前相同。以前的方法更好。

例:

public static void main(String[] args) {
    final String search = "george";
    List<String> q1 = new LinkedList<String>();
    q1.add("tom:120000");
    q1.add("george:130000");
    q1.add("john:120000");
    for (final String q : q1) { //for each string q in the list q1
        if (q.contains(":")) {
            final String[] split = q.split(":");
            final String name = split[0];
            final String time = split[1];
            if (name.equalsIgnoreCase(search)) {
                System.out.println("I found " + search + "!");
                System.out.println(name + " : " + time);
                break;
            }
        }
    }
}

最新更新