这里我试图读取每行只包含整数的文本文件。例如:
1
2
3
1
我编写了以下代码来阅读文本文件。代码如下所示。
package fileread;
import java.io.*;
public class Main {
public static void main(String[] args) {
// TODO code application logic here
try{
FileInputStream fstream=new FileInputStream("C:/Users/kiran/Desktop/text.txt");
DataInputStream in=new DataInputStream (fstream);
BufferedReader br=new BufferedReader(new InputStreamReader(in));
String str;
while((str=br.readLine())!=null){
System.out.println(str);
}
in.close();
}
catch(Exception e){
System.err.println(e);
}
}
}
现在我想只检索那些重复并显示给用户的整数。 在这种情况下,我想显示“1”。
我如何在Java中实现它?
答案 0 :(得分:1)
您需要读取数组中的值,然后在该数组中查找重复的条目。
答案 1 :(得分:1)
package fileread;
import java.io.*;
import java.util.HashSet;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Set<String> uniqueLines = new HashSet<String>();
Set<String> duplicatedLines = new HashSet<String>();
try{
FileInputStream fstream=new FileInputStream("C:/Users/kiran/Desktop/text.txt");
DataInputStream in=new DataInputStream (fstream);
BufferedReader br=new BufferedReader(new InputStreamReader(in));
String str;
while((str=br.readLine())!=null){
if (uniqueLines.contains(str)) {
if (!duplicatedLines.contains(str)) {
duplicatedLines.add(str);
System.out.println(str);
}
} else {
uniqueLines.add(str);
}
}
in.close();
}
catch(Exception e){
System.err.println(e);
}
}
}
注意:确保您的输入在每一行上没有尾随空格。另外请注意,当列表变长时,此实现并不特别符合内存。
答案 2 :(得分:0)
完全读取文件,将行保存到您选择的数据结构(map(key = line,value = count),数组只有整数),枚举数据结构并打印其值大于1的数据(如果值代表计数)。
或动态:读取文件,添加条目/列表/数组,如果未包含在set / list / array中,则打印出行。
答案 3 :(得分:0)
好吧,您可以使用一个包含10个插槽的数组,这些插槽映射到0到9之间的数字。对于每一行,您可以检查该数字是什么,并相应地增加数组中的值。它会是这样的:
// Initialize the array
int[] numberArray = new int[10];
for (int i = 0 ; i < 10 ; i++) numberArray[i] = 0;
while((str=br.readLine())!=null){
int number = Integer.parseInt(str);
numberArray[number]++;
}
for (int i = 0 ; i < 10 ; i++) {\
if (numberArray[i] > 1) System.out.println(i);
}
答案 4 :(得分:0)
除了给定的答案之外,请确保将字符串转换为整数(数字)并捕获异常,以防来自文件的任何内容不是数字。在这种情况下,我认为您可以安全地忽略该异常,因为它不相关,但检查输入数据是一种很好的做法。
答案 5 :(得分:0)
像这样的东西
package fileread;
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) {
Hashtable ht = new Hashtable();
try{
FileInputStream fstream =
new FileInputStream("C:/Users/kiran/Desktop/text.txt");
DataInputStream in=new DataInputStream (fstream);
BufferedReader br=new BufferedReader(new InputStreamReader(in));
String str;
while((str=br.readLine())!=null){
String sproof = (String) ht.get(str.trim());
if (sproof != null && sproof.equals("1")) {
System.out.println(str);
} else {
ht.put(str.trim(), "1");
}
}
in.close();
}
catch(Exception e){
System.err.println(e);
}
}
}
答案 6 :(得分:0)
首先,我将定义1个列表和1组整数,如下所示:
ArrayList<Integer> intList = new ArrayList<Integer>();
Set<Integer> duplicateIntSet = new HashSet<Integer>(); //Set is used to avoid duplicates
然后,我会检查重复项并将'em'添加到各自的列表中,如下所示:
while((str=br.readLine())!=null){
if(!str.isEmpty()) {
Integer i = Integer.parseInt(str);
if(intList.contains(i)) {
duplicateIntSet.add(i);
} else {
intList.add(i);
}
}
}
答案 7 :(得分:0)
我会使用两套方法;
public static void main(String[] args) {
Set<Integer> result = new HashSet<Integer>();
Set<Integer> temp = new HashSet<Integer>();
try{
FileInputStream fstream=new FileInputStream("text.txt");
DataInputStream in=new DataInputStream (fstream);
BufferedReader br=new BufferedReader(new InputStreamReader(in));
String str;
while((str=br.readLine())!=null){
if (!"".equals(str.trim())){
try {
Integer strInt = new Integer(str.trim());
if(temp.contains(strInt)){
result.add(strInt);
} else {
temp.add(strInt);
}
} catch (Exception e){
// usually NumberFormatException
System.err.println(e);
}
}
}
in.close();
}
catch(Exception e){
System.err.println(e);
}
for(Integer resultVal : result){
System.out.println(resultVal);
}
}
或者,您也可以使用单个HashMap,其中HashMap.Key作为Integer,HashMap.Value作为该Integer的计数。 然后,如果您以后需要重构以查找单个事件的所有实例,那么您可以轻松地执行此操作。
public static void main(String[] args) {
Map<Integer, Integer> frequency = new HashMap<Integer, Integer>();
try{
FileInputStream fstream=new FileInputStream("text.txt");
DataInputStream in=new DataInputStream (fstream);
BufferedReader br=new BufferedReader(new InputStreamReader(in));
String str;
while((str=br.readLine())!=null){
if (!"".equals(str.trim())){
try {
Integer strInt = new Integer(str.trim());
int val = 1;
if(frequency.containsKey(strInt)){
val = frequency.get(strInt).intValue() + 1;
}
frequency.put(strInt, val);
} catch (Exception e){
// usually NumberFormatException
System.err.println(e);
}
}
}
in.close();
}
catch(Exception e){
System.err.println(e);
}
// this is your method for more than 1
for(Integer key : frequency.keySet()){
if (frequency.get(key).intValue() > 1){
System.out.println(key);
}
}
// This shows the frequency of values in the file.
for(Integer key : frequency.keySet()){
System.out.println(String.format("Value: %s, Freq: %s", key, frequency.get(key)));
}
}
注意NumberFormatExceptions,根据你的情况,你可以在循环内或循环外处理它们。