按长度过滤数组元素

时间:2015-02-09 01:07:24

标签: java arrays methods

所以我希望能够让用户输入数组的长度并用名称填充它。执行此操作后,程序将打印出名称旁边的字符串长度。

public static void main(String[] args)
{
    Scanner sc = new Scanner(System.in);
    String names [];

    // Read the number of kids
    System.out.print("How many kids are there? ");
    int size = sc.nextInt();

    // Read the names of the kids
    String [] kids = new String [size];

    for (int k = 0; k < kids.length; k++)
    {
        System.out.print("Enter name of kid #" + k + ": ");
        kids[k] = sc.next();
    }
    // Print all the names of the kids and the length of their names
    System.out.println("Names of kids with lengths are: ");

    for (int i = 0; i < kids.length; i++)
    {
      System.out.println(kids[i] + " " + kids[i].length());
    }

在此之后,我希望用户输入一个整数,程序将在数组中搜索任何长度的字符串,如果它找到任何我希望它打印出它找到的所有字符串的首字母。我必须使用这个程序的方法。但我似乎无法绕过这个陷入困境。

static int countByLength(String [] names, int length)
{
    int count = 0;



    return count;
}


/**
 * Filter an array of names and keep only those names with a given length
 * @param names: an array of names
 * @param length: an integer length
 * @return the array of names that have the given length
 */
static String [] filterByLength(String [] names, int length)
{
    String [] filtered = new String[length];

    for(int k = 0; k < filtered.length; k++)
    {
        filtered [k] = 
    }

    return filtered; 
}

}

4 个答案:

答案 0 :(得分:2)

一个问题是,您不知道您将获得多少结果,因此阵列不是最佳数据结构。我建议使用列表,例如ArrayList。然后你可以迭代数组,将所有匹配的字符串添加到列表中。

static List<String> filterByLength(String [] names, int length)
{
   List<String> filtered = new ArrayList<String>();

   for(int k = 0; k < filtered.length; k++)
   {
       if (names.length() == length) filtered.add(names[k]);
   }

   return filtered; 
}

答案 1 :(得分:0)

变量(参数)名称的错误选择增加了您的困惑。 length中的countByLength参数是要查找的名称的长度,length中的filterByLength看起来也是如此。然而,您在length中使用filterByLength作为名称数组的长度 - 换句话说,就是名称的总数。

如果你真的想使用普通阵列(我建议听听@ Jack在评论中提出的建议,或者编辑:@ Leander的答案),那么计算数量可能是最容易的。首先匹配的名称,然后使用那么多元素创建和填充新的名称数组。看起来你想通过简单地获得过滤数组的大小来进行计数,这就是为什么这会成为一个鸡与蛋的问题。

答案 2 :(得分:0)

我将使用您创建的方法回答问题,忽略其有效或无效的解决方案。

// Count the array that have name with same length
static int countByLength(String [] names, int length)
{
    int count = 0;

    for(int i = 0;i < names.length;i++)
    {
      if(names[i].length() = length) count++;
    }


    return count;
}


/**
 * Filter an array of names and keep only those names with a given length
 * @param names: an array of names
 * @param length: an integer length
 * @return the array of names that have the given length
 */
static String [] filterByLength(String [] names, int length)
{
    String [] filtered = new String[countByLength(names, length)];
    int index = 0;

    for(int k = 0; k < filtered.length; k++)
    {
        if(names[k].length() == length) filtered[index++]=names[k];
    }

    return filtered; 
}

答案 3 :(得分:0)

如果您使用的是Java 8并使用List而不是数组,则可以使用filter在一行代码中实现此目的:

List<String> filterByLength(List<String> names, int length) {
   return names.stream().filter(n -> n.length() == length).collect(Collectors.toList());
}
  • names.stream()List变为Stream
  • filter(n -> n.length() == length)仅保留流中长度等于length的元素。
  • collect(Collectors.toList())List
  • 返回Stream