2015-02-09 3 views
0

Так что я хочу, чтобы у меня была возможность попросить пользователя ввести длину массива и заполнить его именами. После этого программа распечатает имена с длиной строки рядом с ними.Элементы массива фильтра по длине

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; 
} 

}

+0

Используя массив фиксированного размера не самый простой/безопасный способ сделать это, то лучше использовать '' ArrayList для этой цели, и преобразовать его в массив после. – Jack

ответ

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; 
} 
+0

Спасибо. Я понимаю, что это не лучший способ написать эту программу, но я должен изучить основы, и это был код, который мне пришлось написать – Kapaz

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; 
} 
0

Плохой выбор имен переменных (параметров) добавлен в ваше замешательство. Параметр length в countByLength - это длина имен для поиска, и это выглядит так: length в filterByLength. Однако вы используете length в filterByLength как длину массива имен - общее количество имен, другими словами.

Если вы действительно хотите использовать простой массив (и я бы посоветовал прислушаться к предложению Джека в комментарии или, отредактировав: ответ @ Leander), было бы легче всего подсчитать количество имен, которые соответствуют первым, а затем создать и заполнить новый массив имен таким количеством элементов. Похоже, вы хотите сделать подсчет, просто получив размер фильтрованного массива, и именно поэтому это стало проблемой курица и яйцо.

+0

Да, я вставил оригинальную версию программы, которую опубликовал мой инструктор. Я пошел вперед и переименовал их в свою программу, потому что я был смущен. – Kapaz

0

Если вы используете Java 8 и использовать список вместо массива вы можете использовать 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
Смежные вопросы