Java 子串的替代方案

Java 子串的替代方案,java,arraylist,substring,Java,Arraylist,Substring,在向字符串数组中添加值时,我遇到了一个奇怪的问题,该字符串数组后来使用哈希映射进行数组排序。我有一个文件名XFR900a,使用以下代码将XFR900部分添加到数组中 private ArrayList<String> Types = new ArrayList<String>(); ... Types.add(name.substring(0,(name.length() - 1)); System.out.println(name.substring(0,(name

在向字符串数组中添加值时,我遇到了一个奇怪的问题,该字符串数组后来使用哈希映射进行数组排序。我有一个文件名XFR900a,使用以下代码将XFR900部分添加到数组中

private ArrayList<String> Types = new ArrayList<String>();

...

Types.add(name.substring(0,(name.length() - 1));
System.out.println(name.substring(0,(name.length() - 1));
这只是手动完成的子字符串部分,非常混乱

有什么好的替代子字符串的方法吗,因为其中一定有一些奇怪的非ascii字符

菲尔

更新

谢谢大家的评论。下面是稍后比较字符串的一些代码

    for (int i=0;i< matchedArray.size();i++){

        //run through the arrays
        if (last == matchedArray.get(i)) {
            //add arrays to a data array
            ArrayList data = new ArrayList();
            data.add(matchedArray1.get(i));
            data.add(matchedArray2.get(i));
            data.add(matchedArray3.get(i));
            data.add(matchedArray4.get(i));
            data.add(matchedArray5.get(i));
            //put into hash map 
            map.put(matchedArray.get(i), data);
        }
        else {
            //TODO
            System.out.println("DO NOT MATCH :" + last + "-" + matchedArray.get(i));
for(int i=0;i
如您所见,我添加了一个测试系统.out.println(“不匹配”),下面是一些输出

不匹配:FR99-XFR900 不匹配:XFR900-XFR900

我只在XFR900a文件名上运行子字符串。问题是最后打印的测试行!=matchedArray.get(I),但是打印到显示器上时它们是相同的


Phil

您不应该使用
=
操作符来比较字符串的内容。
=
检查它是否是同一个对象。改为写入
last.equals(matchedArray.get(i))
方法检查对象是否相等,而不是它们是否相同。如果是
字符串,则检查两个字符串是否由相同的字符组成。这可能会消除您的奇怪行为

PS:string上的
=
行为有点不可预测,因为java虚拟机会进行一些优化。如果两个字符串相等,jvm可能会对这两个字符串使用相同的对象。这是可能的,因为
string
对象无论如何都是不可变的。这可以解释如果您手动关闭子字符串。一种情况下jvm会优化,另一种情况下不会优化。

使用
.equals()
而不是
=
,因为它们是字符串

if (last.equals(matchedArray.get(i))) {}

如果要检查值,请不要使用==运算符,因为运算符将检查对象引用的相等性,请使用检查值而不是引用的等于运算符,即(int i=0;i
for (int i=0;i< matchedArray.size();i++){

//run through the arrays if (last.equals(matchedArray.get(i))) { // Line edited //add arrays to a data array ArrayList data = new ArrayList(); data.add(matchedArray1.get(i)); data.add(matchedArray2.get(i)); data.add(matchedArray3.get(i)); data.add(matchedArray4.get(i)); data.add(matchedArray5.get(i)); //put into hash map map.put(matchedArray.get(i), data); } else { //TODO System.out.println("DO NOT MATCH :" + last + "-" + matchedArray.get(i));
//遍历数组 if(last.equals(matchedArray.get(i)){//行编辑 //将数组添加到数据数组 ArrayList数据=新的ArrayList(); data.add(matchedaray1.get(i)); data.add(matchedaray2.get(i)); data.add(matchedaray3.get(i)); data.add(matchedaray4.get(i)); data.add(matchedaray5.get(i)); //放入哈希映射 map.put(matchedArray.get(i),data); } 否则{ //待办事项 System.out.println(“不匹配:“+last+”-“+matchedArray.get(i));
Side comment-Java命名约定:变量以小写开头(类型=>Types).substring是您想要的方法。如果您对使用不同方法的奇怪的非ASCII字符有问题,则会遇到相同的问题。我建议您更详细地调查到底发生了什么。substring以某种方式扰乱输入的可能性对我来说似乎非常低。我宁愿在指责API funct之前检查代码两次另外,Java变量的约定是第一个小写,因此类型而不是类型“行为不同”是什么意思?两个排序列表(手动与编码)有何不同?能否在排序输出中公布差异?
for (int i=0;i< matchedArray.size();i++){

//run through the arrays if (last.equals(matchedArray.get(i))) { // Line edited //add arrays to a data array ArrayList data = new ArrayList(); data.add(matchedArray1.get(i)); data.add(matchedArray2.get(i)); data.add(matchedArray3.get(i)); data.add(matchedArray4.get(i)); data.add(matchedArray5.get(i)); //put into hash map map.put(matchedArray.get(i), data); } else { //TODO System.out.println("DO NOT MATCH :" + last + "-" + matchedArray.get(i));