Java 数组包含空值
我试图从文本文件中读取一些单词,然后将它们排列成降序数组。 我成功地读取了单词,将单词存储在一个数组中,当我继续将其按降序排列时,我注意到数组中还包含一些空值。 当我尝试使用(下面的完整代码)删除空值时Java 数组包含空值,java,Java,我试图从文本文件中读取一些单词,然后将它们排列成降序数组。 我成功地读取了单词,将单词存储在一个数组中,当我继续将其按降序排列时,我注意到数组中还包含一些空值。 当我尝试使用(下面的完整代码)删除空值时 Arrays.stream(w.words).filter(x->x!=null).toArray(),它仍然不起作用。 经过一段时间的努力,现在我想我需要一些帮助。 本阶段代码、文本文件及输出如下: ` null是因为您声明的字数组(预定义大小)。也许您可以更改它并使用ArrayList(因为
Arrays.stream(w.words).filter(x->x!=null).toArray()代码>,它仍然不起作用。
经过一段时间的努力,现在我想我需要一些帮助。
本阶段代码、文本文件及输出如下:
`
null是因为您声明的字数组(预定义大小)。也许您可以更改它并使用ArrayList(因为它可以是动态大小的)而不是字符串数组,这可以帮助您解析。为了帮助您,请遵循以下更改:
private List words=new ArrayList()代码>
/*更新readFile()中的下一行,而不是单词[count]=scanLine.next()*/
words.add(scanLine.next())代码>
更改方法签名排序(列表字符串)
//同时更新以下声明
int[]lengthsArray=new int[string.size()];
String[]sortedStrings=新字符串[String.size()]代码>
在print语句中将数组.toString(w.words)更改为仅w.words
希望这有帮助。一切看起来都很好。@Obicere我名为file.txt的输入文件只包含一行,与ACT、CAT、AT、RAT、PAT、TAT等相同。我想做的是将这些单词按降序排列,就是这样。@Obicere我不知怎么删除了你的评论?我看不到你刚才的评论是的,我刚刚意识到你把它包括进去了scanner.next()
按空格分隔,将其切换为逗号。我还避免使用缓冲阅读器和扫描仪。哦,好的。我还需要学习另一点,谢谢你的链接。我在这里写了一个简单的例子:谢谢你,关于@Naveen的详细信息,我想说它部分有效,因为出于某种原因,我的排序功能仍然没有按长度排序单词。但是谢谢你的回答,因为它解决了空指针异常的问题。很高兴知道这对你有帮助。对于排序,您必须为此更新代码逻辑。。。
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Objects;
import java.util.Random;
import java.util.Scanner;
import java.util.Set;
import java.util.stream.Collectors;
public class Practise {
private Scanner fp;
private Scanner scanLine;
private String[] words = new String[6] ;
int count;
String temp;
String [][] samewords;
int size;
String[] words_sorted;
public Practise() {
openFile();
readFile();
printa();
}
private void openFile() {
try {
fp = new Scanner(new File ("D:\\workspace\\file.txt"));
}
catch (Exception e) {
System.out.println("File does not exist");
}
}
private void readFile() {
try {
count = 0;
while (fp.hasNextLine()) {
String strLine = fp.nextLine();
scanLine = new Scanner(strLine);
words[count] = scanLine.next();
System.out.println("Here2"+words[count]);
System.out.println();
count++;
}
}
catch (Exception e) {
System.err.print("Error: " + e.getMessage());
}
}
private void printa() {
try (BufferedReader br = new BufferedReader(new FileReader("D:\\workspace\\file.txt"))) {
size = findLongestWords();
samewords = new String[size][size];
String line;
int i = 0;
String [] temp;
while ((line = br.readLine()) != null) {
temp = line.split(",");
for (int j = 0; j < samewords[i].length; j++) {
samewords[i][j] = temp[j];
System.out.println(samewords[i][j]);
}
i++;
}
//System.out.println(answers[1][2]);
} catch (IOException e) {
e.printStackTrace();
}
}
public int findLongestWords() throws FileNotFoundException {
int longest_word = 0;
int current;
BufferedReader sc = new BufferedReader(new FileReader("D:\\workspace\\file.txt"));
String li;
String[] tr;
try {
while ((li = sc.readLine())!= null ) {
tr = li.split(",");
current = tr.length;
if (current > longest_word) {
longest_word = current;
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("\n"+longest_word+"\n");
return longest_word;
}
private String[] sort(String[] string) {
/*Local variables*/
Map<String, Integer> map=new LinkedHashMap<String, Integer>();
Map<String, Integer> mapCopy=new LinkedHashMap<String, Integer>();
int [] lengthsArray=new int[string.length];
String [] sortedStrings=new String[string.length];
int counter1=0;
int counter2=0;
/* Store all the pairs <key,value>
* i.e <string[i],string[i].length>
*/
for(String s:string) {
System.out.println(s);
map.put((String) s, s.length());
lengthsArray[counter1]= s.length();//store all the lengths
counter1++;
}
mapCopy=new LinkedHashMap<String, Integer>(map);//make a copy of map
Arrays.sort(lengthsArray);//sort the array of lengths
/*
* Sort array according to the array of lengths
* by finding the matching value from the map
* then add it to the final string array,and then remove it from the map
*/
for(int item:lengthsArray) {
for(Map.Entry<String, Integer> e:map.entrySet()) {
if(item==e.getValue()) {
sortedStrings[counter2]=e.getKey();
counter2++;
map.remove(e.getKey());
break;
}
}
}
map=mapCopy;
System.out.println(map);//print map
return sortedStrings;
}
public static void main(String[] args) {
Practise w = new Practise();
System.out.println(Arrays.toString(w.words));
w.sort(w.words);
}
}
`
Here2ACT,CAT,AT,RAT,PAT,TAT
6
ACT
CAT
AT
RAT
PAT
TAT
[ACT,CAT,AT,RAT,PAT,TAT, null, null, null, null, null]
ACT,CAT,AT,RAT,PAT,TAT
null
Exception in thread "main" java.lang.NullPointerException
at Practise.sort(Practise.java:190)
at Practise.main(Practise.java:239)