0

我有一个非常快速的问题,我猜只是盯着我看,但我看不到它。我必须计算某个名称在数组中出现的次数。我使用循环来做到这一点,因为我不允许使用类、hashmap 等。所以我有 93 个名称,例如 Jake 出现 5 次,我希望输出为:

       Jack - 5

相反,我的程序显示

       Jack - 5
       Jack - 5
       Jack - 5
       Jack - 5
       Jack - 5

我只希望它打印一次,这是我的循环:

for (int counter = 0; counter < name.length; counter++)
    {
        String n = (name[counter]);
        int count = 0;
        for (int i = 0; i < name.length; i++){
            if (name[i].equals(n))
                count++;
        }

        System.out.println(n + " - " + count);
    }

理想的输出应该是:

                  Jack - 5

我需要打印星号作为输出,所以我想说

                 Jack (5) ***** 

每个星号代表一个事件,我知道如何打印它们,我已经把它放在我的代码中,但它显示

                ***** Jack(5) 

我想知道我该如何解决这个问题,有什么想法吗?

4

3 回答 3

1

您正在循环浏览列表中的每个名称并每次都检查它。因此,您检查名称 Jack 5 次,因此您得到 5 个输出。

至于由于某种原因您不允许使用 HashMaps,这应该可以解决它:

String name[] = new String[]{"jack", "jack", "jack", "james", "jack", "jack", "james"};
ArrayList<String> checkedNames = new ArrayList<String>();

for (int counter = 0; counter < name.length; counter++)
{
    String n = (name[counter]);
    if(!checkedNames.contains(n))
    {
        int count = 0;
        for (int i = 0; i < name.length; i++){
            if (name[i].equals(n))
                count++;
        }
        checkedNames.add(n);
        System.out.println(n + " - " + count);
    }

}

编辑:因为您不能使用 ArrayLists 但可以对数组进行排序:

    String name[] = new String[]{"jack", "jack", "jack", "jack", "jack", "james"};
    String lastName = "";

    Arrays.sort(name);

    for (int counter = 0; counter < name.length; counter++)
    {
        String n = (name[counter]);


        if(!lastName.equals(n))
        {
            int count = 0;
            for (int i = 0; i < name.length; i++){
                if (name[i].equals(n))
                    count++;
            }

            System.out.println(n + " - " + count);
        }
        lastName = n;
    }

第二次编辑

首先,Arrays 是 Java 内置的一个类,就像 String 一样:

http://docs.oracle.com/javase/6/docs/api/java/util/Arrays.html http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String .html

其次,如果您希望它打印星号,则将 System.out.println 行更改为:

System.out.println(n + " (" + count + ")" + new String(new char[count]).replace("\0", "*"));
于 2013-04-17T15:45:31.430 回答
0

你会尝试有一个不同的数组(比如说encouteredNames)来存储那些你已经计算过出现次数的名字吗?然后仅当您确定要搜索的名称以前没有搜索过(或者它仍然没有存储在encounteredNames数组中)时才执行“计数”循环。

我确信有比这更好的实现,但与此同时:

String[] names = {"Jack", "James", "Charles", "Jack", "Jack", "James"};
String[] encounteredNames = new String[names.length];
int encounteredNamesCount = 0;
for (int counter = 0; counter < names.length; counter++) {
  String name = (names[counter]);
  boolean nameAlreadyEncountered = false;
  for (int i = 0; i < encounteredNames.length && encounteredNames[i] != null; i++) {
    if (encounteredNames[i] == name) {
      nameAlreadyEncountered = true;
      break;
    }
  }
  if (!nameAlreadyEncountered) {
    encounteredNames[encounteredNamesCount++] = name;
    int count = 0;
    for (int i = 0; i < names.length; i++){
      if (names[i].equals(name)) {
        count++;
      }
    }
    System.out.println(name + " - " + count);
  }
}
于 2013-04-17T15:48:45.717 回答
0

请检查下一个代码:

for (int counter = 0; counter < name.length; counter++)
    {
        String n = (name[counter]);
        int count = 0;
        boolean flag = true;
        for (int i = 0; i < counter; i++){
            if (name[i].equals(n)) {
               flag = false;
            }
        }
        if (flag) {
           for (int i = 0; i < name.length; i++){
               if (name[i].equals(n))
                   count++;
           }

           System.out.println(n + " - " + count);
        }
    }

在这里,您检查了所选名称是否尚未在数组中(从 0 到计数器),而不是您计算它在数组中保留的次数并显示信息。

于 2013-04-17T16:08:09.730 回答