1

所以我有一个包含这些行的文件

155, 490, 297, 490,
-45, 19, 45, 19,
-24, 80,-12,-69, 80,
12,-92, 28,-40,

我尝试读取文件并找到这些包含重复元素的行。但是我的逻辑有些错误,我找不到错误。有什么帮助吗?

这是代码:

public static void main(String[] args) throws IOException {
        Scanner fileInput = null;
        try {
            fileInput = new Scanner( new File("array_list.csv"));
            String line;
            while (fileInput.hasNextLine()) {
                line = fileInput.nextLine(); 
                String[] lineArr = line.split(",");
                // check for missing values
                boolean contains = true;
                for(int i=0; i<lineArr.length; i++) {
                    for(int j=0; j<lineArr.length; j++) {
                        if(lineArr[i]==lineArr[j]) {
                            contains = false;
                            break;
                        }
                    }
                    if(!contains) {
                        // print the row .....
                    }
                    else {
                        contains = true;
                        // print some thing ...
                    }
                }
            }
            } finally {
            if (null != fileInput) {
                fileInput.close();
            }
        }
    }
4

7 回答 7

3

由于您正在比较字符串,因此您需要使用以下equals()方法:

lineArr[i].equals(lineArr[j])

话虽如此,我还可以看到其他一些可能会给您带来问题的事情:

  • 注意逗号后面的空格。样本数据不一致,所以最好调用lineArr[i].trim()去掉前导/尾随空格。
  • 您应该contains最初设置为 false 并尝试找到匹配项,然后将其设置为 true 并中断。然后if (contains),打印该行。
  • 设置循环的方式,您将检查每个元素本身。因此,您当然会为每一行找到一个重复项!
于 2013-10-22T07:17:58.033 回答
1

立即引起我注意的问题是您正在使用字符串,并且您当前正在使用“==”运算符来比较此行中的字符串:

if(lineArr[i]==lineArr[j]) {

这应该是:

if(lineArr[i].equals(lineArr[j])) {
于 2013-10-22T07:19:02.587 回答
1

尝试将您的代码替换为

if(lineArr[i].equals(lineArr[j])) 

反而

if(lineArr[i]==lineArr[j]) 

该方法使用底层表示equals()比较 的实际内容,而仅使用它们在内存中的对象的身份进行比较。StringsUnicode==address

于 2013-10-22T07:20:13.607 回答
1

将所有值放入一个集合并检查其长度是否等于原始数组。如果是,那么所有值都是唯一的,否则它们不是:

while (fileInput.hasNextLine()) {
    line = fileInput.nextLine();
    List<String> lineArr = Arrays.asList(line.split(","));
    if (new HashSet<String>(lineArr).size() != lineArr.size()) {
        System.out.println(line);
    }
}
于 2013-10-22T07:20:25.570 回答
0

这是我查找重复元素的代码

import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class StringManipulation {
    public static void main(String[] args) {

        StringManipulation manipulation=new StringManipulation();
        manipulation.findDuplicateElementList();
        //manipulation.findDuplicateElementbyMap();

    }

    private void findDuplicateElementList() {

        String lineData = "ashish manish ashish manish sachin manish ashish neha manish";

        String[] list = lineData.split(" ");

        List<String> stringList = Arrays.asList(list);

        // containingList=stringList;
        Set<String> stringSet = new HashSet<String>();

        for (int i = 0; i < stringList.size(); i++) {
            int count = 0;
            String currVal = stringList.get(i);

            if (stringSet.contains(currVal)) {
                continue;
            } else {

                for (String string : stringList) {
                    if (currVal.equals(string)) {
                        stringSet.add(currVal);
                        count++;

                    }

                }
            }

            System.out.println("Occurances of " + currVal + " " + count);

        }
    }


}
于 2014-02-11T09:21:04.293 回答
0

公共静态 void main(String[] args) 抛出 IOException{

    Scanner fileInput = null;
    try {           
        fileInput = new Scanner(new File("array_list.csv"));
        String line;
        while (fileInput.hasNextLine()) {

            line = fileInput.nextLine(); 
            String[] lineArr = line.split(",");
            // check for missing values
            boolean contains = true;
            for(int i=0; i<lineArr.length; i++) {

                for(int j=0; j<i; j++) {
                    if(lineArr[i].equals(lineArr[j])) {
                        contains = false;
                        break;
                    }
                }

            }
            if(!contains) {
                System.out.println(line);
            }
            else {
                contains = true;
            }
        }
        } finally {
        if (null != fileInput) {
            fileInput.close();
        }
    }
}
于 2013-10-22T07:37:26.670 回答
0

你应该比较String使用equals().

然而,您的代码中还有其他问题。在某些时候,ij是相等的,因此lineArr[i]==lineArr[j]将永远为真。

检查重复项的一种简单方法是使用 aSet并检查其大小:

Set<String> lineSet = new HashSet<lineArr.length>;
for(String s : lineArr) {
    lineSet.add(s);
}
if(lineSet.size() < lineArr.length) {
    // there are duplicates
}
于 2013-10-22T07:24:50.050 回答