Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中从arrayList中删除项_Java_Netbeans_Collections_Arraylist - Fatal编程技术网

在java中从arrayList中删除项

在java中从arrayList中删除项,java,netbeans,collections,arraylist,Java,Netbeans,Collections,Arraylist,我有一个程序,它从文件中获取输入,将文件中的每个单词保存为一个标记,然后将每个标记添加到数组列表中 问题是arrayList显示为例如[“猫”、“狗”、“狗”、“鸟”、“鸟”),我不想要arrayList中的空格 读取的文件设置如下所示: cat dog bird 很明显,空格是空格造成的,但空行是必需的。 无论如何,我的代码如下: import java.io.BufferedReader; import java.io.DataInputStream; import java.io.F

我有一个程序,它从文件中获取输入,将文件中的每个单词保存为一个标记,然后将每个标记添加到数组列表中

问题是arrayList显示为例如[“猫”、“狗”、“狗”、“鸟”、“鸟”),我不想要arrayList中的空格

读取的文件设置如下所示:

cat dog


bird
很明显,空格是空格造成的,但空行是必需的。

无论如何,我的代码如下:

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

public class NewMain{

public static void main(String[] args){

    try{
        FileInputStream fstream = new FileInputStream("Filename");

        //Get the object of datainputstream
        DataInputStream in = new DataInputStream(fstream);
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        String strLine;

        List<String> listOfWords = new ArrayList<String>();
       while((strLine = br.readLine()) != null){
        String [] tokens = strLine.split("\\s+");
        String [] words = tokens;
        for(String word : words){
            listOfWords.add(word);
            System.out.print(word);
            System.out.print(" ");      
        } 
        System.out.print("\n");
    }
       System.out.println(listOfWords);

        List<String> space = new ArrayList<String>();
        String[] spaces = {" "};
        space.addAll(Arrays.asList(spaces));

        editList(listOfWords,space);

        System.out.println(listOfWords);
in.close();
    }
    catch(Exception e){
        System.err.println("Error: " + e.getMessage());    
    }  
}

public static void editList(Collection<String> list1, Collection<String> list2){
    Iterator<String> it = list1.iterator();
        while(it.hasNext()){         
       if(list2.contains(it.next())) {
                it.remove();
            }  
       }
}
} 
导入java.io.BufferedReader;
导入java.io.DataInputStream;
导入java.io.FileInputStream;
导入java.io.InputStreamReader;
导入java.util.ArrayList;
导入java.util.array;
导入java.util.Collection;
导入java.util.Iterator;
导入java.util.List;
公共类纽曼{
公共静态void main(字符串[]args){
试一试{
FileInputStream fstream=新的FileInputStream(“文件名”);
//获取datainputstream的对象
DataInputStream in=新的DataInputStream(fstream);
BufferedReader br=新的BufferedReader(新的InputStreamReader(in));
弦斯特林;
List listOfWords=new ArrayList();
而((strLine=br.readLine())!=null){
字符串[]标记=strLine.split(\\s+);
字符串[]字=标记;
for(字符串字:字){
添加(单词);
系统输出打印(word);
系统输出打印(“”);
} 
系统输出打印(“\n”);
}
System.out.println(listOfWords);
列表空间=新的ArrayList();
字符串[]空格={”“};
addAll(Arrays.asList(spaces));
编辑列表(单词列表,空格);
System.out.println(listOfWords);
in.close();
}
捕获(例外e){
System.err.println(“错误:+e.getMessage());
}  
}
公共静态无效编辑列表(集合列表1、集合列表2){
迭代器it=list1.Iterator();
而(it.hasNext()){
if(list2.contains(it.next())){
it.remove();
}  
}
}
} 

字符串[]空格={'}应该删除空白空间,因为我通过从非文件数组中移除空格来测试它。奇怪的是如果我把它改成
String[]spaces={“cat”}它将从arrayList中删除cat。

在for循环中添加一个if条件:

for(String word : words){
            if(!word.equals(""))  /* OR if( (word.length > 0) )*/  {
            listOfWords.add(word);
            System.out.print(word);
            System.out.print(" ");   
           }   
        } 

原因很明显。一种可能的解决方案是使用以下方法:

strLine=br.readLine().trim()

然后将
while
循环实现为:

while(strLine!=null&&!strLine.isEmpty()){//do stuff}
尝试删除空字符串-由于您通过空格模式拆分
\s+
,您的列表中将不会有
”,但是

但是不要在事后删除它们,首先不要添加它们

if (word.length() == 0) continue;
listOfWords.add(word);
(并添加所需的任何类似过滤器!)


这不仅仅是简单的。它的效率也要高得多。从数组列表中删除元素需要花费
O(n)
。因此,用于筛选的代码的复杂性是
O(n^2)
(通过复制到第二个列表中,您可以将其降至
O(n)
)。不首先添加元素基本上是免费的;通过这种方式,您的解析甚至会变得更快一点-仍然是
O(n)
,但在第二步中比过滤器更快。

工作得非常好。真不敢相信我没试过。谢谢
word.length()==0
比比较空字符串更合理。看看我的答案。@Anony Mousse:不管怎样。。!我已经更新了ans。主要目的是让OP知道他需要在哪里添加条件。那就看他了,哪种状态适合他。不过谢谢你的建议:)也很有效,谢谢。这只是我程序的一小部分,我处理的是不是由我创建的大型文件,因此手动删除每个文件的所有空间太多了。但是感谢“首先不要添加它们”,我指的是你
listOfWords.add(word)的代码将它们添加到列表中;不到原始数据!我还解释了为什么在解析时过滤比在后处理列表时过滤更快。如果你的文件这么大,你应该注意它的区别。我认为这只是对空行的特定情况的一种解决方法。假设他会在
上分手
,并有一行,如
字;单词单词
,他仍然会得到两个空单词。这绝对没有错。有时你想过滤空行,但保留空词。是的,这取决于程序的目标。在这种情况下,在实现上述while循环后,他可以轻松地检查每个令牌是否也是空的,然后相应地处理它。请不要使用DataInputStream来读取文本
if (word.length() == 0) continue;
listOfWords.add(word);