0 / 0 / 0
Регистрация: 07.10.2015
Сообщений: 3
1

Перевод строки в двумерный срез

07.10.2015, 14:54. Показов 6349. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день.
Задача кода в том чтобы строку перевести в двумерный срез по словам и по символам новой строки.
Строка:
111 222 333 444 \n555 666 777 \n888 999
Ожидаемый результат:
[[111 222 333 444][555 666 777][888 999]]
Результат работы программы:
[[888 999 777 444][888 999 777][888 999]]

Часть кода программы отвечающая за данную манипуляцию:

Go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package main
 
import "fmt"
 
func main(){
str:="111 222 333 444 \n555 666 777 \n888 999 "
    strOut:=""
    var stringSlice []string
    var out [][]string
    for _, x:=range str{
        if string(x)==" " {
            stringSlice=append(stringSlice,strOut)
            strOut=""
        }else if string(x)=="\n" {
            out=append(out,stringSlice)
            stringSlice=stringSlice[0:0]
        }else {
            strOut+=string(x)
        }
    }
    if len(stringSlice)!=0 {
        out=append(out,stringSlice)
        stringSlice=stringSlice[0:0]
    }
fmt.Println(out)
}
Вопрос:
В чем ошибка если она имеется и почему такой странный результат?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.10.2015, 14:54
Ответы с готовыми решениями:

Переписать двумерный массив в одномерный, заменяя перевод строки на пробел
Нужна помощь. не работает сравнение.. и через strcmp() тоже for (i = 0; i < N; i++) { for...

Заменить в строке все пробелы на перевод строки, а перевод строки изменить на два перевода
Меня интересует следующий вопрос: как заменить в моем стринге все пробелы на переходы на новую...

Разбиение строки на части, перевод строки в число и перевод числа
Есть задание: 1. Необходимо реализовать консольное приложение, позволяющее манипулировать строкой,...

Перевод одномерного массива в двумерный
Здравствуйте. Столкнулся с данной проблемой, необходимо перевести одномерный массив в двумерный...

10
2443 / 1841 / 406
Регистрация: 15.12.2013
Сообщений: 8,237
07.10.2015, 15:07 2
Цитата Сообщение от Vladislav-777 Посмотреть сообщение
В чем ошибка если она имеется и почему такой странный результат?
Код форматируйте тегами и оставляйте ссылку на http://play.golang.org/

Почему вы не хотите сделать так?
Go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package main
 
import (
    "fmt"
    "strings"
)
 
func main() {
    str:="111 222 333 444 \n555 666 777 \n888 999 "
    temp := strings.Split(str,"\n")
    slice := make([][]string,len(temp))
    for ind := range temp {
    slice[ind] = strings.Split(temp[ind]," ")
    }
    fmt.Println(slice)
    
}
http://play.golang.org/p/GIzEW39FUU
0
0 / 0 / 0
Регистрация: 07.10.2015
Сообщений: 3
07.10.2015, 16:24  [ТС] 3
Цитата Сообщение от S_el Посмотреть сообщение
Почему вы не хотите сделать так?
Хотелось бы реализовать данный код без задействования библиотек.
Не могу понять почему
Цитата Сообщение от Vladislav-777 Посмотреть сообщение
stringSlice=append(stringSlice,strOut)
в моем варианте кода обрабатывается ни так как подразумивается.
0
2443 / 1841 / 406
Регистрация: 15.12.2013
Сообщений: 8,237
07.10.2015, 20:45 4
Цитата Сообщение от Vladislav-777 Посмотреть сообщение
в моем варианте кода обрабатывается ни так как подразумивается.
ссылочные типы. С ними нужно быть очень внимательными.

Изменил ваш код:
Go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package main
 
import "fmt"
 
func main(){
str:="111 222 333 444 \n555 666 777 \n888 999 "
    strOut:=""
    var stringSlice []string
    var out [][]string
    
    for _, x:=range str{
        if string(x)==" " {
            stringSlice=append(stringSlice,strOut)
            strOut=""
        }else if string(x)=="\n" {
        temp := make([]string,len(stringSlice))
        copy(temp,stringSlice)
        out = append(out,temp)
            stringSlice=stringSlice[0:0]
        }else {
            strOut+=string(x)
        }
    }
    if len(stringSlice)!=0 {
        out=append(out,stringSlice)
        stringSlice=stringSlice[0:0]
    }
fmt.Println(out)
}
0
Эксперт функциональных языков программированияЭксперт Java
4485 / 2720 / 485
Регистрация: 28.04.2012
Сообщений: 8,585
07.10.2015, 21:37 5
Цитата Сообщение от Vladislav-777 Посмотреть сообщение
C
1
if string(x)==" " {
Что за ад? =)

Go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package main
 
import "fmt"
 
func split(s string) [][]string {
    start   := 0
    inword  := false
    line    := []string{}
    result  := [][]string{}
    addword := func(end int) {
        if inword {
            line   = append(line, substring(s, start, end))
            inword = false
        }
    }
    addline := func() {
        if len(line) > 0 {
            result = append(result, line)
            line   = []string{}
        }
    }
    for i, b := range s {
        switch b {
        case ' ', '\t':
            addword(i)
        case '\n':
            addword(i)
            addline()
        default:
            if !inword {
                inword = true
                start  = i
            }
        }
    }
    addline()
    return result
}
 
func substring(s string, start, end int) string {
    if start < 0 || end > len(s) || start >= end {
        return ""
    }
    sub := make([]byte, end-start)
    copy(sub, []byte(s[start:end]))
    return string(sub)
}
 
func main() {
    s := "111 222 333 444 \n555 666 777 \n888 999 "
    fmt.Println(split(s))
}
http://play.golang.org/p/KyYc-u7VuC

И вообще
0
0 / 0 / 0
Регистрация: 07.10.2015
Сообщений: 3
08.10.2015, 11:11  [ТС] 6
Цитата Сообщение от S_el Посмотреть сообщение
ссылочные типы. С ними нужно быть очень внимательными.
Спасибо большое. Так все работает как предполагалось. Осознал свою ошибку работы со срезом stringSlice.
Цитата Сообщение от korvin_ Посмотреть сообщение
Обязательно изучу, возможно мне больше подойдет ваша реализация кода. Видео интересно, по нему нашел много полезной информации.

Спасибо за помощь!
0
24 / 7 / 0
Регистрация: 08.10.2015
Сообщений: 36
08.10.2015, 12:49 7
Цитата Сообщение от Vladislav-777 Посмотреть сообщение
Спасибо большое. Так все работает как предполагалось. Осознал свою ошибку работы со срезом stringSlice.

Обязательно изучу, возможно мне больше подойдет ваша реализация кода. Видео интересно, по нему нашел много полезной информации.

Спасибо за помощь!
Вам привели плохой пример. Пример Se_l лучше, чем пример Kovrin.
А реализацию функции Split можно посмотреть в исходниках самого Go.
Они же открыты!!! Для Вас открыты!!!
0
Эксперт функциональных языков программированияЭксперт Java
4485 / 2720 / 485
Регистрация: 28.04.2012
Сообщений: 8,585
08.10.2015, 21:54 8
Цитата Сообщение от Cow Посмотреть сообщение
Вам привели плохой пример. Пример Se_l лучше, чем пример Kovrin.
Расскажи же причины такого заявления.
0
24 / 7 / 0
Регистрация: 08.10.2015
Сообщений: 36
09.10.2015, 11:49 9
Цитата Сообщение от korvin_ Посмотреть сообщение
Расскажи же причины такого заявления.
В вашем примере совершенно лишнее усложнение. addword := func(end int) - предположу, что ваш background это JavaScript.

В реальной жизни программисту приходится много бороться с реальными проблемами, возникающими для решения задач в конкретной предметной области. И все это в условиях жестких сроков и жестких требований к качеству. Зачем усложнять себе жизнь самовыдуманными проблемами?

Оно не нужно.

Человек, очевидно, учится. Учиться нужно правильному. Не следует писать самому то, что уже написано до вас.

А если уж хочется изучать такие вещи - то имеет смысл читать стандартную библиотеку.
Её реализовывали намного более сильные программисты, чем вы или я или автор вопроса. Там есть чему поучиться.

И, что очень важно, стандартная библиотека написана с учетом правильного программирования именно в Go-стиле, а не в стиле Java, Python, JavaScript. Особенно рекомендую см. начиная с Go 1.5 - в ней существенные куски кода переписали на Go (в 1.4 было еще много Сишного кода).

Переходящие с других языков пытаются применить свой прежний опыт и обламываются. К пример, "как так - нет generics", "как так - нет исключений". Поэтому изучение сильных программ на Go - это полезно.

P.S.:
Для тренировки мозгов полезен Haskell.
0
Эксперт функциональных языков программированияЭксперт Java
4485 / 2720 / 485
Регистрация: 28.04.2012
Сообщений: 8,585
09.10.2015, 22:36 10
Цитата Сообщение от Cow Посмотреть сообщение
В вашем примере совершенно лишнее усложнение. addword := func(end int)
В чём тут сложность? Обычное оформление повторяющихся действий в отдельную процедуру. Предпочитаешь копипаст-программирование?

Цитата Сообщение от Cow Посмотреть сообщение
addword := func(end int) - предположу, что ваш background это JavaScript.
Ошибочное предположение.

Цитата Сообщение от Cow Посмотреть сообщение
В реальной жизни программисту приходится много бороться с реальными проблемами, возникающими для решения задач в конкретной предметной области. И все это в условиях жестких сроков и жестких требований к качеству. Зачем усложнять себе жизнь самовыдуманными проблемами?
В моём коде нет никаких проблем.

Цитата Сообщение от Cow Посмотреть сообщение
Человек, очевидно, учится. Учиться нужно правильному. Не следует писать самому то, что уже написано до вас.
Это ты его преподавателю расскажи, чтоб такие задания не давал. А от копипаста кода из стандартной библиотеки он ничему, кроме копирования, не научится.

Цитата Сообщение от Cow Посмотреть сообщение
А если уж хочется изучать такие вещи - то имеет смысл читать стандартную библиотеку.
Имеет смысл читать теорию алгоритмов. Стандартную библиотеку боготворить не нужно, в ней могут быть ошибки, как и в любом другом софте.

Цитата Сообщение от Cow Посмотреть сообщение
Её реализовывали намного более сильные программисты, чем вы или я или автор вопроса.
Это не защищает их от ошибок.

Цитата Сообщение от Cow Посмотреть сообщение
Там есть чему поучиться.
Для начала пусть освоит банальные вещи. Если бы он был готов к изучению исходников стандартной библиотеки, он бы так и сделал, а не создавал эту тему.

Цитата Сообщение от Cow Посмотреть сообщение
И, что очень важно, стандартная библиотека написана с учетом правильного программирования именно в Go-стиле
Замыкания описаны в спецификации языка. Вот Роб Пайк использует замыкание (с 15:10 примерно), которое захватывает переменную-канал из окружения:
Кликните здесь для просмотра всего текста


Цитата Сообщение от Cow Посмотреть сообщение
Поэтому изучение сильных программ на Go - это полезно
Стандартная библиотека --- это набор старых, довольно банальных алгоритмов. Пусть уж лучше исходники Docker'а почитает в таком случае.

Цитата Сообщение от Cow Посмотреть сообщение
Для тренировки мозгов полезен Haskell.
Очень странное заявление после:
Цитата Сообщение от Cow Посмотреть сообщение
В вашем примере совершенно лишнее усложнение. addword := func(end int) - предположу, что ваш background это JavaScript.
В Хаскелле замыкания сплошь и рядом.
0
0 / 0 / 0
Регистрация: 14.09.2015
Сообщений: 7
18.10.2015, 19:08 11
Что-то Cow не комментирует долго. Присоединюсь к вашей дискуссии, так как мой опыт позволяет мне легко понять его доводы и понять то, что он пишет между строк.

1. Да, korvin, ваш код усложнен. С целью продемонстрировать свою крутизну? Получилось наоборот. Если вы не можете написать простой код для решения простой задачи, то вы не более чем начинающий программер. Личинка программера.

Когда вы закончите учебу и от теоретического программирования перейдете к настоящей работе (или даже когда из начинающего программиста, станете senior - это происходит к 5-7 году), Вы легко поймете, что именно имел ввиду Cow.

Возможно, вы это поймете раньше. А в коде korvin проблема самолюбования - код написанный ради самого кода. Нет достаточно сложной задачи - давайте придумаем ее сами. Это глупо. Программист, решающий реальные задачи и так находится в постоянном цейтноте. Когда ты учишься не нужно учиться усложнять код.

2. "Это ты его преподавателю расскажи, чтоб такие задания не давал. А от копипаста кода из стандартной библиотеки он ничему, кроме копирования, не научится." - а у тебя мания величия? Ты пишешь круче, чем авторы стандартной библиотеки? У тебя можно поучиться, а у них нет? Ха-ха. Думаю, что авторы Go не зря получают в разы больше денег, чем ты сможешь заработать за ближайшие лет 5.

3. Пайк показывает универсальные паттерны. В реальном проекте там много кода можно написать. Здесь же у нас простая задача. Твой ответ слишком сложен для такой задачи.

4. "Стандартная библиотека --- это набор старых, довольно банальных алгоритмов.". Ты еще не программист, если не понимаешь в чем сила именно простых алгоритмов. Что до старости. Большая часть конструкций в современных языках программирования придумана до нашего с тобой рождения.

5. Haskell хорош мозги ломать да. А на Go нужно писать просто и чисто и понятно. Представь, что тебя взяли работать в команду. Ни у кого не будет желания разгребать, мягко говоря, программные кал за другими.

Добавлено через 9 минут
korvin - программисты, которые пишут серьезные программные продукты, работают в командах, в больших командах.
Если твой код требует слишком много времени на его чтение коллегами по команде, то это не они дураки.
Возможно, у Земли есть пуп, но это не ты - программы должны легко читаться, уж в Go все для этого сделали, но находятся такие умники как ты, которые считают что простота - это плохо, что это символ непрофессионализма. В этом ты не прав.
0
18.10.2015, 19:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.10.2015, 19:08
Помогаю со студенческими работами здесь

Перевод одномерного массива в двумерный
Сап, есть символы, указываем любое кол-во столбцов, кол-во строк фиксировано, значения не имеет,...

Перевод из статического массива в динамический. (двумерный)
как это сделать? или кто может - сразу, код: #include &lt;iostream.h&gt; #include &lt;iomanip.h&gt;...

Перевод файла .dat в двумерный массив
В файле формата .dat написаны сначала ширина и длина массива(в разных строчках), а потом начинаются...

Срез
b=&quot;asdfghjkl&quot; b Выдаст=s Как он так отрезает?

Заполните двумерный массив рандомными числами от 10 до 100 посчитать сумму элементов каждой строки и номер строки,в кото
Заполните двумерный массив рандомными числами от 10 до 100 посчитать сумму элементов каждой строки...

Строки. Множества. Выполнить перевод символов строки из верхнего регистра в нижний и наоборот
ПОРЯДОК ВЫПОЛНЕНИЯ 1. Ввести множество, запись или строку с помощью клавиатуры. 2. Вывести на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru