请教:关于ArrayList的indexOf方法的问题

风华正茂12 发布于 2015/01/03 13:52
阅读 2K+
收藏 0
import java.io.*;
import java.util.*;
class English{
StringBuffer CHname;
StringBuffer ENGname;
English(){
CHname=new StringBuffer();
ENGname=new StringBuffer();
}
void Cname(){
System.out.print(CHname);
}
void Ename(){
System.out.print(ENGname);
}
}
public class Eng {

public static void main(String[] args) {
try {
FileReader file=new FileReader("comEng.txt");
BufferedReader br=new BufferedReader(file);
String str;
ArrayList arr1=new ArrayList();
ArrayList arr2=new ArrayList();
Scanner sc=new Scanner(System.in);
while((str=br.readLine())!=null){
String[] strs=str.split(" ");
English e=new English();
for(int i=0;i<strs.length-1;i++){
e.ENGname.append(strs[i]);
e.ENGname.append(" ");
}
e.CHname.append(strs[strs.length-1]);
arr1.add(e.ENGname);
arr2.add(e.CHname);
}
for(int i=0;i<arr1.size();i++){
//System.out.println(((English)arr1.get(i)).ENGname);
System.out.println(arr1.get(i));
}
try{
StringBuffer sname=new StringBuffer(sc.next());
sname.append(" ");
int index=arr1.indexOf(sname);
System.out.println(arr2.get(index));
//System.out.println(arr1.contains(sname));
}
catch(ArrayIndexOutOfBoundsException e)
{
System.out.println("找不到该元素");
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
我创建了两个ArrayList对象,一个是arr1,用于存储e.ENGname,,一个是arr2,用于存储e.CHname。在使用scanner输入要查找的元素sname后,我用ArrayList的indexOf方法来查找在arr1中与sname匹配的元素的位置,但是不知道为什么index的值一直都是-1,实在令小弟不解,请各位大牛不吝赐教。
加载中
0
甘薯
甘薯

你的代码写得真是让人看得稀里糊涂的...

你用arraylist查找里面存放的stringbuffer?

那怎么能找到呢?里面存放的是对象实例,如果2个对象实例不完全相等是不会返回index的...

完全相等是指如果是对象的话, 返回的是同一个对象...

楼主能写出这样的程序说明确实是个新手...

风华正茂12
风华正茂12
恩恩 重新把ENGname和CHname的类型改回String可以了,再定义两个StringBuffer类型的来接收新读入的字符串,然后再通过toString方法把结果分别赋给ENGname和CHname,这样就OK了,非常感谢大家的帮助
甘薯
甘薯
回复 @lhjiang : 就怕出现你这样不理解我话的人, 看我下面网址的补充说明.
l
lhjiang
你的理解也不完全正确,不一定非得是同一个对象,是看你的类的equals方法的,默认是继承Object的,你可以根据自己的需求进行重写。
0
山豆
山豆
你把两个list全部打印出来看看啊
0
吴笑笑
打印看看内容,估计存储对象匹配不对吧,不行你就遍历链表比较好了,拿下标获取对象好了
0
风华正茂12
风华正茂12
打印出来内容发现确实有点问题,改正后还是发现无法找到相应的元素
0
风华正茂12
风华正茂12

直接用遍历的方法好像也不行,相应方法:

for(int i=0;i<arr1.size();i++){
String str2=(String)arr1.get(i);
if(str2.equals(sname))
{
System.out.println(arr2.get(i));
}

}

0
甘薯
甘薯

看一下这里你就知道我上面说的同一个对象是什么意思

http://book.2cto.com/201308/30832.html

0
l
lhjiang

我觉得你这出错在对java引用理解的错误

StringBuffer buffer1 = new StringBuffer();

 StringBuffer buffer2 = new StringBuffer();
 buffer1.append("1");
 buffer2.append("1");

 System.out.println(buffer2.equals(buffer1));

你运行一下这段代码返回的是false,同理你上面也是这么比较这两个对象的,arr1.indexOf(sname); 你查看一下jdk源码 list的indexof用的是equals 方法所以是不相等的两个对象,返回的一直是-1。要是你要的结果想一样可以加上 toString方法将所有StringBuffer 转化为字符串 或者你也可以重写 StringBuffer 的 equals 方法和hashcode方法。

0
风华正茂12
风华正茂12

修改后的代码:

import java.io.*;
import java.util.*;
class English{
String CHname;
String ENGname;
English(){
CHname=new String();
ENGname=new String();
}
void Cname(){
System.out.print(CHname);
}
void Ename(){
System.out.print(ENGname);
}
}
public class Eng {
public static void main(String[] args) {
// TODO 自动生成的方法存根
try {
FileReader file=new FileReader("comEng.txt");
BufferedReader br=new BufferedReader(file);
String str;
ArrayList arr1=new ArrayList();
ArrayList arr2=new ArrayList();
Scanner sc=new Scanner(System.in);
while((str=br.readLine())!=null){
String[] strs=str.split(" ");
StringBuffer str1=new StringBuffer();
StringBuffer str2=new StringBuffer();
English e=new English();
for(int i=0;i<strs.length-1;i++){
str1.append(strs[i]);
str1.append(" ");
}
str2.append(strs[strs.length-1]);
e.ENGname=str1.toString();
e.CHname=str2.toString();
arr1.add(e.ENGname);
arr2.add(e.CHname);
}
for(int i=0;i<arr1.size();i++){
System.out.println(arr1.get(i));
}
for(int i=0;i<arr2.size();i++){
System.out.println(arr2.get(i));
}
try{
String sname = sc.nextLine();
int index=arr1.indexOf(sname);
System.out.println(arr2.get(index));
System.out.println(arr1.contains(sname));
}
catch(ArrayIndexOutOfBoundsException e)
{
System.out.println("找不到该元素");
}
} catch (FileNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}

OSCHINA
登录后可查看更多优质内容
返回顶部
顶部