将数组元素与下一个数组进行比较,并在元素为新元素时重新开始

时间:2015-08-31 13:44:16

标签: java arrays oop

所以我有类似这样的数据

a
a
a
a
b
b
c
d
d
d

我想构建一个程序,程序可以计算文档中每个字符串的数量。所以,从上面的数据来看,我希望结果是a = 4 b = 2 c = 1 d = 3.数据已经排序,所以我想首先我要做一个循环,我将第一个数据与第二。如果匹配,则count变量将递增。如果没有,它会假设它是一个新数据,所以计数重置为0.问题是我没有得到我想要的结果。到目前为止,这是我的代码。

 String[] nextLine;
        int count=0;
        nextLine = reader.readNext();
        String current= nextLine[0];
        while(reader.readNext()!=null){
            nextLine = reader.readNext();
            if(current.matches(nextLine[0])){
                count++;
            }else{
                System.out.println("data = "+current+" total = "+count);
                count=0;
                current = nextLine[0];
            }

        }

reader是我创建的用于从我的文档中读取的对象。 如果你真的不理解我的意思,我很抱歉。我很难说这句话(英语不是我的第一语言),如果你不明白的话就放弃评论。提前谢谢。

因为你问我得到了什么样的结果,这就是我得到的结果

data = 2013-07-01 total = 2199
data = 2013-07-02 total = 0
data = 2013-07-01 total = 1
data = 2013-07-02 total = 0
data = 2013-07-01 total = 0
data = 2013-07-02 total = 0
data = 2013-07-01 total = 0
data = 2013-07-02 total = 0
........
data = 2013-08-09 total = 0
data = 2013-08-12 total = 1
data = 2013-08-11 total = 0
data = 2013-08-12 total = 7
data = 2013-08-11 total = 0
data = 2013-08-12 total = 0
data = 2013-08-11 total = 0
data = 2013-08-10 total = 0
data = 2013-08-11 total = 0
data = 2013-08-12 total = 0
data = 2013-08-11 total = 1
data = 2013-08-12 total = 1
data = 2013-08-11 total = 1
data = 2013-08-12 total = 0
data = 2013-08-10 total = 0
data = 2013-08-12 total = 0

是的,这是一个约会,但是我把它保存在String数据类型中,所以我觉得它不应该是个问题。对于那些试图回答我的问题的人,非常感谢,但我得到的结果与我使用上面的代码得到的结果并没有太大差别。所以我仍然不知道出了什么问题。

4 个答案:

答案 0 :(得分:1)

如果数据在文本文件中排列如下,则此答案将起作用:

a
a
a
a
b
b
b
c
c
c

我的回答使用了Scanner class,希望您觉得它很有帮助。我只是硬编码扫描程序从一个名为stack.txt的文件中读取。这用于我自己的测试,所以一定要用你的文件名替换stack.txt。

Scanner scanner = new Scanner (new File ("stack.txt"));
int charFrequency = 0;
String value = "";
while (scanner.hasNext()){
    String tempValue = scanner.next();
    if ("".equals(value)) {
        value = tempValue;
        charFrequency ++;
    }
    else if (value.equals(tempValue)) {
        charFrequency ++;
    }
    else {
        System.out.println("Data: " +value+" Count: "+charFrequency);
        value = tempValue;  
        charFrequency = 1;
    }
}
System.out.println("Data :" +value+" Count: "+charFrequency);

答案 1 :(得分:0)

在我看来,你的策略和算法都是正确的 - 但是你需要计算第一个 - 你要去的地方数= 0你已经读过一个因此你需要去计数= 1。

您还有一些其他问题: while中的readline会丢弃它的结果,所以你只读取每一行。 前面的readline会造成损失 - 而是将电流设置为无效(0?),然后从那里开始循环。

您可以考虑使用HashSet的另一个(也许是更好的)解决方案。

答案 2 :(得分:0)

我会使用地图并用字符串作为键填充它,并将整数填充为值。所以你可以询问地图是否已经包含下一个密钥,如果是,则计算该值,如果没有放入新密钥并将值设置为1。

类似的东西:

List<String> asList = Arrays.asList("a", "b", "a", "b", "a", "a");
HashMap map = new HashMap<String, Integer>();

for (String s : asList) {
  if(map.containsKey(s))
    map.put(s, (int) map.get(s) + 1);
  else
    map.put(s, 1);
}

for (Object s : map.keySet()) {
     System.out.println(map.get(s));
}

答案 3 :(得分:-2)

试试这个: -

public static void main(String[] args) {
    List asList = Arrays.asList("a","b","a","b","a","a",...);
    Set<String> mySet = new HashSet<String>(asList);
    for(String s: mySet){

     System.out.println(s + " " +Collections.frequency(asList,s));

    }

}