如何在Java中检查null的已删除值?

时间:2015-10-13 06:03:59

标签: java csv arraylist

我有一个记录的arraylist来自输入csv文件。有些记录有完整列但有些记录为空。例如:

abc, 1441652452, 8.64015, 52.75034
abc, 1442279677,,
abc, 1442280570, 10.44255,148.78166

无论如何,连续完整记录中可能有多行。如果你查看记录,在位置[2]和[3],相应地存储纬度和长度。我想要做的是计算第三条记录和第一条记录之间的距离(在我上面的例子中)。 (我已经有了计算latlngs之间距离的公式。 目前,这是我的代码包含的内容:

for (int i = 0; i < oneUserRecord.size(); i++) {
            String currentRecord = oneUserRecord.get(i);
            String[] current = currentRecord.split(",");
            double currentLat = Double.parseDouble(current[3]);
            double currentLng = Double.parseDouble(current[4]);
}

我最初打算做的是检索 next 记录,并提取下一条记录的纬度和长度,然后找出下一条和当前记录的纬度和长度之间的距离。但是,由于记录不完整,因此我不能仅仅因为它们不存在于这些字符串中而提取位置[3]和[4]。 所以,我的问题就是,我如何检查下一条记录的位置[3]和[4]是否为空,如果 为空,我如何指定下一条记录为跟随记录行以获得lat和long的值?

我有一个逻辑,(从上面的代码继续),

String nextRecord = "";

            if ((oneUserRecord.get(i++).split(",")[3]).isEmpty()
                    || (oneUserRecord.get(i++).split(",")[4]).isEmpty()) {
                nextRecord = oneUserRecord.get(i++);
            }
            else {
                nextRecord = oneUserRecord.get(i + 1);
            }

            String[] next = nextRecord.split(",");
            double nextLat = Double.parseDouble(next[3]);
            double nextLng = Double.parseDouble(next[4]);

但它不起作用,仍然出现了界限错误。这是我可以改进的一种方式,或者是另一种让我得到我想要的结果的方法吗?

3 个答案:

答案 0 :(得分:1)

您应该避免多次拆分任何记录。此外,由于输入,这不能按预期工作。

您的示例显示某些值可能完全丢失。这与空值不同。

例如&#34; ,,,&#34;将意味着空值,但&#34;&#34;表示一个空字符串。如果您有这样的不完整条目,没有人可以说哪些是空条目。例如,&#34; a,b,d&#34;翻译成[&#34; a&#34;,&#34; b&#34;,&#34;&#34;,&#34; d&#34;]或[&#34; a&#34;, &#34; b&#34;,&#34; d&#34;,&#34;&#34;]?这只能通过您必须实现的逻辑/解析器来完成。

在您的情况下,以下内容应该足够了:

String nextRecord = oneUserRecord.get(i++).split(",", -1);
while (nextRecord.length < 4) {
  nextRecord = oneUserRecord.get(i++).split(",", -1);
}

@Edit:问题中更改的有效输入不会出现上述问题。但是,您仍应使用String#split(String,int),如图所示。否则,在某些情况下会出现意外结果,例如

"a,b,c,".split()

只会返回一个包含3个元素的数组。

答案 1 :(得分:1)

我认为,问题是如果:

if ((oneUserRecord.get(i++).split(",")[3]).isEmpty()
    || (oneUserRecord.get(i++).split(",")[4]).isEmpty()) {
    nextRecord = oneUserRecord.get(i++);
}

您正在递增i一次,两次或三次。不要在你的病情中使用i++。 ++是一个增量变量并从增量前返回值的运算符。如果您希望获得下一行而不增加i+1

,请在您的情况下使用i

答案 2 :(得分:0)

好的,我知道了,

            String current = oneUserRecord.get(i);
            String[] currentRecord = current.split(",");

            double currentLat = 0, currentLng = 0;

            if (((currentRecord[3].length() > 0) || (currentRecord[4].length() > 0))) {
                currentLat = Double.parseDouble(currentRecord[3]);
                currentLng = Double.parseDouble(currentRecord[4]);
            } else {

            }

            double nextLat = 0, nextLng = 0;
            if ((i + 1) < oneUserRecord.size()) {
                String next = oneUserRecord.get(i + 1);
                String[] nextRecord = next.split(",");

                if (((nextRecord[3].length() > 0) || (nextRecord[4].length() > 0))) {
                    nextLat = Double.parseDouble(nextRecord[3]);
                    nextLng = Double.parseDouble(nextRecord[4]);
                } else {
                }
            }

我没有检查列中的字符串是否为空,而是检查了它的长度。不知何故,这不会给我一个空字符串错误。对于当前记录和下一记录,默认的lat和long设置为零,因此对于不完整的记录,它们的默认距离为零,以便我轻松计算,不需要跳过不完整的记录。

感谢您的其余答案!希望我的解决方案对于那些需要相同逻辑代码的人来说可能会派上用场。