【问题标题】:Tokenize an arraylist标记一个数组列表
【发布时间】:2014-08-26 10:31:37
【问题描述】:

我有一个文本文件,其值如下:

[2014-08-19 00:00:21,702] REC|SRC:923142676343|DST:9900|CNT:1|OPR:zong|\nADD BBCLANDAN\n 
[2014-08-19 00:01:02,958] REC|SRC:923138824807|DST:9900|CNT:1|OPR:zong|ADD TRIXXS 
[2014-08-19 00:01:12,799] REC|SRC:923125473547|DST:9900|CNT:1|OPR:zong|ADD SahafatMedia 
[2014-08-19 00:01:32,894] REC|SRC:923142676343|DST:9900|CNT:1|OPR:zong|ADD BBCMEDIA\n\n 
[2014-08-19 00:02:42,754] REC|SRC:923119511824|DST:9900|CNT:1|OPR:zong|ADD sMs
[2014-08-19 00:01:43,753] REC|SRC:923119511824|DST:9900|CNT:1|OPR:zong|ADD RIDAsMs

我已经阅读了文本文件并将其存储到带有输出的数组列表中:

输出:

923119511824|DST:9900|CNT:1|OPR:zong|ADD RIDAsMs
923119511824|DST:9900|CNT:1|OPR:zong|ADD sMs
923125473547|DST:9900|CNT:1|OPR:zong|ADD SahafatMedia 
923138824807|DST:9900|CNT:1|OPR:zong|ADD TRIXXS 
923142676343|DST:9900|CNT:1|OPR:zong|ADD BBCMEDIA\n\n 
923142676343|DST:9900|CNT:1|OPR:zong|\nADD BBCLANDAN\n 
[2014-08-19 00:01:02,958] REC|
[2014-08-19 00:01:12,799] REC|
[2014-08-19 00:01:32,894] REC|
[2014-08-19 00:01:43,753] REC|
[2014-08-19 00:02:42,754] REC|
[2014-08-19 00:00:21,702] REC|

现在我想标记这个数组列表以仅显示输出中的重复联系人号码,例如 923142676343 及其在 ADD 之后的内容,例如 TRIXXS 我需要帮助吗???

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;

public class pring
{

    public static final String FILE_LOCATION = "C:/Users/DfroJaCk DB/Desktop/zongrecv.txt";

    public static void main ( String [ ] args )
    {
        //Your reader
        BufferedReader in = null;
        //Where you store the Strings
        ArrayList < String > al = new ArrayList < String > ();
        try
        {
            //Open the file and give it to the reader
            in = new BufferedReader ( new FileReader ( FILE_LOCATION ) );
            String line;
            //As long as the file has more lines read a line at a time
            while ( ( line = in.readLine () ) != null )
            {
                //Split the line and stoe it in an array
                String [ ] splitLine = line.split ( "SRC:" );
                for ( int i = 0; i < splitLine.length; i++ )
                {
                    //Add each element of the split array into an ArrayList
                    al.add ( splitLine [ i ] );
                }
            }
        //Catch your possible problems
        } catch ( FileNotFoundException fnfe )
        {
            fnfe.printStackTrace ();
        } catch ( IOException ioe )
        {
            ioe.printStackTrace ();
        }       
        //Sort your list
        Collections.sort ( al );
        for ( String s : al )
        {
            //spit it out
            System.out.println ( s );
        } 
    }
}

【问题讨论】:

    标签: java arraylist stringtokenizer


    【解决方案1】:

    你可以使用 java StringTokenizer。由于您的 arraylist 已经排序,您只需要检查连续的位置。使用 |作为分隔符,获取每个包含数字的条目的第一个标记,并将其与以下条目的第一个标记进行比较。如果它们相等,则获取最后一个标记中空间的索引并打印它之后的内容。

    小心考虑超过 2 个条目包含相同电话号码的情况,不要打印两次。

    但您可能会重新考虑您的方法,将字符串存储在 ArrayList 中的方式看起来很混乱。

        List<String> myList = new ArrayList();
        myList.add("923119511824|DST:9900|CNT:1|OPR:zong|ADD RIDAsMs");
        myList.add("923119511824|DST:9900|CNT:1|OPR:zong|ADD sMs");
        myList.add("923125473547|DST:9900|CNT:1|OPR:zong|ADD SahafatMedia");
    
        Collections.sort(myList);
    
        System.out.println(myList.toString());
    
        for (int i = 0; i < myList.size() - 1; i++) {
    
            String currentEntry = myList.get(i);
            String nextEntry = myList.get(i + 1);
    
            StringTokenizer tokenizer = new StringTokenizer(currentEntry, "|");
            String currentNumber = tokenizer.nextToken();
    
            tokenizer = new StringTokenizer(nextEntry, "|");
            String nextNumber = tokenizer.nextToken();
    
            String lastToken = "";
    
            if (currentNumber.equals(nextNumber)) {
    
                System.out.println(currentNumber + " duplicate");
    
                while (tokenizer.hasMoreTokens()) {
    
                    lastToken = tokenizer.nextToken();
                }
    
                System.out.println("last token: " + lastToken);
                int index = lastToken.indexOf(" ");
                System.out.println("What you probably want: " + lastToken.substring(index + 1));
    
            }
    
        }
    

    这样的输出将是:

    [923119511824|DST:9900|CNT:1|OPR:zong|ADD RIDAsMs, 923119511824|DST:9900|CNT:1|OPR:zong|ADD sMs, 923125473547|DST:9900|CNT:1|OPR:zong|ADD SahafatMedia]
    923119511824 duplicate
    last token: ADD sMs
    What you probably want: sMs
    

    【讨论】:

    • ok @DeiAndrei 我是 java 新手,你能告诉我如何在这段代码中使用 stringtokenizer 以及在哪里使用吗?
    • 我的意思是在哪里以及如何检查连续位置?
    • @Hassan Hameed 我添加了一些可以帮助您的代码。但请注意,例如数字 923119511824 如果出现 3 次,则显示 2 次,如果出现 4 次,则显示 3 次(n 次出现 n-1 次),因此您可能需要跳过连续重复.请记住,您的列表已排序:)
    • 这个很好,代码也很容易理解,但是你已经使用了myList.add,但是如果我想读取一个文件来做到这一点??
    • 使用您已有的列表即可。不过,您应该只遍历前半部分,因为后半部分没有数字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    • 2019-08-07
    • 2013-11-02
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多