获取数组的长度

时间:2015-03-07 15:15:44

标签: java

我正在尝试从字符串中提取元音并找到这些元音的数量。我声明的计数器工作正常,但数组长度始终相同。有人可以解释这种行为吗?

import java.util.ArrayList;
import java.util.List;

public class Vow {
    static int count = 0;
    String arr[] = new String[40];

    public static char[] getV(char[] list) {
        List<Character> a = new ArrayList<Character>();
        char[] vow = new char[30];
        char[] soluc = null;
        int count = 0;

        if (list==null) {
            System.out.println("You are passing null value");
            return null;
        }

        for (int i = 0; i < list.length - 1; i++) {
            if (isV(list[i])) {
                a.add(list[i]);
                vow[i] = list[i];
                count ++;
            }
        }

        System.out.println("no of vowels is " + count);//this works
        System.out.println("size is " + vow.length);
        System.out.println("vowels are " + String.valueOf(vow));
        System.out.println("size is " + vow.length);//but this does not why ?
        System.out.println("ar is " + a);
        return vow; 
    }

    public static boolean isVowel(char c) {
        String vowels = "aeiouAEIOU";
        return vowels.indexOf(c) >= 0; //c exists in the String vowels
    }

    public static void main(String[] args) {
        String s = "harestiou";
        char[] a = s.toCharArray();
        char[] b = getV(a);
        System.out.println(b);
        System.out.println(b.length);//it is not showing the length of vowels                             but instead the original size it was allocated
    }
}

3 个答案:

答案 0 :(得分:2)

我认为你的问题是你希望.length应该返回&#34;真实元素的数量&#34;一个数组。

这不是发生的事情:当你创建一个大小为30的数组时,比如

someArray =new char[30] ... 

然后someArray.lenght总是返回30;无论有多少&#34;插槽&#34;在你实际填充的那个数组中。例如,您必须将数组转换为String,以便检索实际的字符数。

答案 1 :(得分:1)

System.out.println("size is"+vow.length);//but this does not why ?

那是因为char []vow=new char[30]; 您创建了一个固定长度的数组,然后在if条件中,您只是更新该数组的元素,因此即使您没有更改该char数组的内容,{{1}也会保持长度相同将永远是30,因为这是你用它创建的大小。

如果你需要一个char [],那么你应该手动复制元素,因为现有的方法只处理Objects-&gt; Objects的复制,但是你需要原始的char []数组,所以在你返回之前改变这样的代码许愿

我认真建议将您的vow.length变量名称更改为List<Character>或更有意义的内容,而不仅仅是单个字母名称,例如charList

a

答案 2 :(得分:1)

限制大小为30的元音数组不是最佳解决方案。如果输入字符串的元音数超过30,那么它将失败。我对getV功能进行了一些改动。使用StringBuffer而不是重复使用变量和数组。虽然可以进一步优化!!!

 public static char[] getV(char[] list) {

   // No need of these extra arrays. so commenting and using single   StringBuffer to hold vowels.
    //List<Character> a=new ArrayList<Character>();
    //char []vow=new char[30];
    //char[] soluc=null;
    StringBuffer sb = new StringBuffer();



    int count=0;

    if(list==null)
    {
        System.out.println("You are passing null value");
        return null;
    }

    for(int i=0;i<list.length-1;i++)
    {
        if(isVowel(list[i])==true)
        {

            sb.append(list[i]);
                    count ++;

        }


    }


    System.out.println("no of vowels is"+count+"");//this works
    System.out.println("size is" + sb.toString().length());
    System.out.println("vowels are  "+sb.toString());
    System.out.println("size is "+sb.toString().length());//but this does not why ?
    System.out.println("ar is  "+sb.toString());

    return sb.toString().toCharArray();

}

希望这有帮助。 (虽然可以进一步优化逻辑!!!)