Форум программистов, компьютерный форум, киберфорум
Наши страницы
Lua
Войти
Регистрация
Восстановить пароль
 
borgetko
0 / 0 / 0
Регистрация: 11.07.2015
Сообщений: 12
#1

Массив: из исходного массива создать 2й ObjTableSort, который бы объединял x, y, z для каждого совпадения name - Lua

28.12.2016, 04:44. Просмотров 726. Ответов 10

Доброго времени суток.
Не так давно увлекся Lua и в процессе написания массивов возникли проблемы, а именно:
Есть массив объектов ObjTable, в котором содержится name, x, y, z
Необходимо из этого массива создать 2й ObjTableSort, который бы объединял x, y, z для каждого совпадения name
Например:

Код
ObjTable =
1. name = Объект1, x = 10, y = 10, z = 10
2. name = Объект2, x = 20, y = 20, z = 20
3. name = Объект3, x = 30, y = 30, z = 30
4. name = Объект4, x = 50, y = 50, z = 50
5. name = Объект3, x = 35, y = 35, z = 35
6. name = Объект1, x = 15, y = 15, z = 15
7. name = Объект2, x = 25, y = 25, z = 25
8. name = Объект3, x = 40, y = 40, z = 40
Необходимо из ObjTable получить

Код
ObjTableSort =
1. name = Объект1, {
x = 10, y = 10, z = 10
x = 15, y = 15, z = 15
}
2. name = Объект2, {
x = 20, y = 20, z = 20
x = 25, y = 25, z = 25
}
3. name = Объект3, {
x = 30, y = 30, z = 30
x = 35, y = 35, z = 35
x = 40, y = 40, z = 40
}
4. name = Объект4, {
x = 50, y = 50, z = 50
}
Подскажите как это сделать.
Заранее спасибо.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.12.2016, 04:44
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Массив: из исходного массива создать 2й ObjTableSort, который бы объединял x, y, z для каждого совпадения name (Lua):

Создать массив, элементами которого являются суммы цифр каждого элемента исходного массива
Дан одномерный массив, который содержит не более 40 целых чисел. Создать новый ...

Массив: Получить массив, который содержит все элементы исходного массива, кратные трем
Дан двумерный массив размером n*n, заполненный целыми числами. а) Все его...

Создать новый массив элементами которого являются суммы делителей каждого числа старого исходного
Дан одномерный массив, который содержит не более 40 целых чисел. Создать новый...

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

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

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

10
BozKurt
297 / 274 / 101
Регистрация: 06.05.2014
Сообщений: 861
Завершенные тесты: 1
28.12.2016, 16:23 #2
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
tbl = {
    { name = "1", x = 10, y = 10, z = 10 },
    { name = "2", x = 20, y = 20, z = 20 },
    { name = "3", x = 30, y = 30, z = 30 },
    { name = "4", x = 50, y = 50, z = 50 },
    { name = "3", x = 35, y = 35, z = 35 },
    { name = "1", x = 15, y = 15, z = 15 },
    { name = "2", x = 25, y = 25, z = 25 },
    { name = "3", x = 40, y = 40, z = 40 },
}
 
tblGroup = {}
 
for i = 1, #tbl do
    if tblGroup[tbl[i].name] ~= nil then
        local lenght = #tblGroup[tbl[i].name]
        tblGroup[tbl[i].name][lenght + 1] = { x = tbl[i].x, y = tbl[i].y, z = tbl[i].z }
    else
        tblGroup[tbl[i].name] = { { x = tbl[i].x, y = tbl[i].y, z = tbl[i].z } }
    end
end
таблица tblGroup будет иметь следующий вид:
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
tblGroup = {
    "1" = {
        { x = 10, y = 10, z = 10 },
        { x = 15, y = 15, z = 15 },
    },
    "2" = {
        { x = 20, y = 20, z = 20 },
        { x = 25, y = 25, z = 25 },
    },
    "3" = {
        { x = 30, y = 30, z = 30 },
        { x = 35, y = 35, z = 35 },
        { x = 40, y = 40, z = 40 },
    },
    "4" = {
        { x = 50, y = 50, z = 50 },
    },
}
1
ProgJ
87 / 85 / 10
Регистрация: 20.11.2008
Сообщений: 724
28.12.2016, 16:52 #3
Лучший ответ Сообщение было отмечено borgetko как решение

Решение

или так
Код
local function groupByName(tbl)
	local tbl2={}
	for _,row in ipairs(tbl) do
		local t=tbl2[t.name]
		if not t then
			t={}
			tbl2[t.name]=t
		end
		table.insert(t,row)
	end
	return tbl2
end
Добавлено через 14 минут
только в двух места заметить t.name на row.name
1
borgetko
0 / 0 / 0
Регистрация: 11.07.2015
Сообщений: 12
28.12.2016, 22:06  [ТС] #4
Спасибо огромное!

Добавлено через 38 минут
Воспользовался функцией от ProgJ и столкнулся с вот такой проблемой. Как измерить количество объектов в получившейся таблице и как обращаться к эти элементам?
#tbl2 выдает 0, что в принципе логично, и не совсем понимаю как обратиться к элементу например Объект1, в записи row.name содержатся кавычки, что не дает обращаться к элементу как к массиву. Пытаюсь обратиться вот так tbl2.Объект1
На ум приходит только искусственная нумерация при создании row.name, но вот как обращаться к этим элементам не понимаю
0
ProgJ
87 / 85 / 10
Регистрация: 20.11.2008
Сообщений: 724
29.12.2016, 12:07 #5
Цитата Сообщение от borgetko Посмотреть сообщение
как обратиться к элементу
с помощью next или pairs можно посмотреть, что внутри
или обращаться по правильным индексам, например, tab2["1"]
1
BozKurt
297 / 274 / 101
Регистрация: 06.05.2014
Сообщений: 861
Завершенные тесты: 1
03.01.2017, 14:21 #6
borgetko, если Объект1 - это переменная, а не строковый литерал, то в качестве индекса используется именно эта переменная: tbl2[Объект1], если же это всё же строка, то можно с помощью двух эквивалентных записей tbl2.Объект1 == tbl2["Объект1"], собственно об этом уже писал тебе ProgJ.
1
borgetko
0 / 0 / 0
Регистрация: 11.07.2015
Сообщений: 12
04.01.2017, 10:57  [ТС] #7
Спасибо всем за ответ!
Возник еще вот такой вопрос как правильно составить функцию которая в заданном радиусе находила бы объект?
Например:
Нужно найти от заданной точки найти точки в ее радиусе
Например найти для Объекта с координатами x = 10, y = 10, z = 10 все точки в радиусе 20
Javascript
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
local function radfunc(obj, tbl, num)
    if obj~= nil and tbl ~= nil and num ~= nil then
        local table = tbl
        local radius = num
                local obj = obj
        нахождение по х и y в радиусе num
        ...
    end 
end -- end func
 
local tbl3 = {}
local obj[1] = { x = 5, y = 5, z = 5}
 
local function FindObj(tbl, num)
    if tbl ~= nil then
        for i=1, #tbl do
            local tbl = tbl[i]
            if radfunc(tbl, num) then
                tbl3[#tbl3+1] = {
                    x = tbl.x,
                    y = tbl.y,
                    z = tbl.z,
                }
            end
        end
    end
    table.sort(tbl3, function(a,b) return a.y < b.y end)
    table.sort(tbl3, function(a,b) return a.x < b.x end)
    return tbl3
    
end -- end func
 
tblGroup = {
    1. name = Объект1, x = 10, y = 10, z = 10
    2. name = Объект2, x = 20, y = 20, z = 20
    3. name = Объект3, x = 30, y = 30, z = 30
    4. name = Объект4, x = 50, y = 50, z = 50
    5. name = Объект3, x = 35, y = 35, z = 35
    6. name = Объект1, x = 15, y = 15, z = 15
    7. name = Объект2, x = 25, y = 25, z = 25
    8. name = Объект3, x = 40, y = 40, z = 40
}
 
FindObj(obj, tblGroup, 20)
Должно получиться нечто подобное

Javascript
1
2
3
4
5
6
tbl3 = {
1. x = 10, y = 10, z = 10
2. x = 15, y = 15, z = 15
3. x = 20, y = 20, z = 20
4. x = 25, y = 25, z = 25
}
0
ProgJ
87 / 85 / 10
Регистрация: 20.11.2008
Сообщений: 724
04.01.2017, 11:09 #8
borgetko, нужно найти расстояние от центра окружности до проверяемой точки и сравнить его с радиусом
0
borgetko
0 / 0 / 0
Регистрация: 11.07.2015
Сообщений: 12
04.01.2017, 22:08  [ТС] #9
Т.е. это должно быть примерно так?

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
local function radfunc(obj, tbl, num)
    if obj ~= nil and tbl ~= nil and num ~= nil then
        local table = tbl
        local radius = num
        local obj = obj[1]
        local abs = math.abs
        for i=1, #table do
            local table = table[i]
            if abs(table.x - obj.x) <= radius or abs(table.y - obj.y) <= radius then
                return true
            end
        end
    end 
    return false
end -- end func
0
ProgJ
87 / 85 / 10
Регистрация: 20.11.2008
Сообщений: 724
04.01.2017, 23:43 #10
borgetko, обычно пользуются евклидовым расстоянием, а оно вычисляется, как корень из суммы квадратов разностей координат
Кроме того не понятно, что у вас в переменной tbl. В прошлом посте это была одна точка, а сейчас набор точек
1
borgetko
0 / 0 / 0
Регистрация: 11.07.2015
Сообщений: 12
05.01.2017, 08:22  [ТС] #11
Я понял, спасибо.
tbl это просто обозначение места, в котором должна быть таблица, а при применении функции FindObj(obj, tblGroup, 20), tblGroup - уже конкретная таблица, obj - точка вокруг которой находим другие
0
05.01.2017, 08:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.01.2017, 08:22
Привет! Вот еще темы с решениями:

Дан одномерный массив G[n]. создать массив N, удалив из исходного массива минимальные элементы
Распишите пожалуйста подробнее!!!

Массив: Создать одномерный массив, записав в него максимальные элементы каждой строки исходного массива.
Дан двумерный массив(вводится с клавиатуры). Создать одномерный массив, записав...

Создать массив из чётных чисел исходного массива
Дан массив из N натуральных чисел. Создать массив из чётных чисел этого...

Создать массив из номеров нулевых элементов исходного массива
В целочисленной последовательности есть нулевые элементы. Создать массив из...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru