Что нового

[Массивы] Сортированный список с пустыми строками

arfey

Новичок
Сообщения
25
Репутация
2
Добрый день.

Имеется: скрипт по сортировке строк текста. Работает, с ним проблем нет.

Нужно: перед каждой новой первой буквой между предыдущей строкой и текущей делать пустую строку.

Например.
Список от A до Z.

A...
A...

B...

C...

Как подойти к решению этого вопроса просто ума не приложу.

Список (двумерный массив) сортируется функцией _ArraySort, после преобразовывается в одномерный, выводится из массива функцией _ArrayToString() и записывается в файл.
На сколько я правильно понимаю, пустые строки нужно в крутить еще на этапе двумерного массива...
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
arfey
У меня так работает. В 1.txt отсортированный текст.
Код:
#include <file.au3>

Dim $aR
_FileReadToArray("1.txt", $aR)
For $i = 0 To UBound($aR) - 1
	If $i + 1 = UBound($aR) Then ExitLoop
	$s1 = StringLeft($aR[$i + 1], 1)
	$s2 = StringLeft($aR[$i], 1)
	If $s1 <> $s2 Then
		$aR[$i + 1] = StringReplace($aR[$i + 1], $aR[$i + 1], StringLeft($aR[$i + 1], 1) _
		& "..." & $aR[$i + 1])
		$aR[$i] = StringReplace($aR[$i], $aR[$i], $aR[$i] & @CRLF)
	EndIf
Next
_FileWriteFromArray("2.txt", $aR, 1)
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Вот мой вариант : (если я правильно понял задачу)
Код:
#include <Array.au3>
Dim $aArray[11]=[0,'Anton','Vint','Boris','Ben' ,'Centr','Dammy','Ena','Alla','Nic' ,'Gen']
Dim $sDefLetter,$sText
_ArrayDisplay($aArray)
_ArraySort($aArray)
For $i=1 To UBound($aArray)-1
   $sFirstLetter=StringLeft( $aArray[$i],1  )
   If $sFirstLetter <> $sDefLetter And $sDefLetter <> '' Then 
	  $sText&= '||' & $aArray[$i]
   Else 
	  $sText&= '|' & $aArray[$i]
   EndIf
   $sDefLetter=$sFirstLetter
Next
$aArray=StringSplit($sText,'|')
_ArrayDisplay($aArray)



Добавлено:
Сообщение автоматически объединено:

Или еще проще :
Код:
#include <Array.au3>
Dim $aArray[11]=[0,'Anton','Vint','Boris','Ben' ,'Centr','Dammy','Ena','Alla','Nic' ,'Gen']
Dim $sDefLetter
_ArrayDisplay($aArray)
_ArraySort($aArray)
For $i=1 To UBound($aArray)-1
   $sFirstLetter=StringLeft( $aArray[$i],1  )
   If $sFirstLetter <> $sDefLetter And $sDefLetter <> '' Then 
	  _ArrayInsert ($aArray,$i,' ')
   EndIf
   $sDefLetter=$sFirstLetter
Next
_ArrayDisplay($aArray)
 
Автор
A

arfey

Новичок
Сообщения
25
Репутация
2
Большое спасибо, ребята.

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

Вопрос решен.

Есть еще один вопрос, менее сложный, просто сам не могу его понять.
Почему в цикле при использовании функции размера массива (UBound) необходимо указывать его размер с "-1"?
Последняя строка массива не учитывается или это недочет функции UBound?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
arfey
В массиве первая строка обычно показывает количество элементов, т.е. счет идет не от 1 а от 0 и UBound возвращает общее кол-во элементов. Если, к примеру, у Вас в массиве 5 элементов, то UBound вернет число 6.
 
Автор
A

arfey

Новичок
Сообщения
25
Репутация
2
В начале я тоже исходил из подобных соображений. Такое чувство, что ответ перед носом, но я его не замечаю :(

Во пример. Есть массив с пятью элементами.

Код:
#include <Array.au3>
Dim $array[5] = ['a', 's', 'd', 'f', 'g']
$array[2] = 'p'
_ArrayDisplay($array)

MsgBox(4096, 'Размер массива', UBound($array))


UBound возвращает 5. Все верно, так и должно быть.
Но если использовать цикл For, то скрипт будет матерится на не правильную размеренность массива или что-то подобное.

Код:
Local $nText
For $i = 0 to UBound($array)
	$nText &= $array[$i]
Next
MsgBox(4096, 'Размер массива', $nText)


Ругается:
Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
$nText &= $array[$i]
$nText &= ^ ERROR

Ага. Пока писал, понял, что индекс всегда на одну единицу меньше размера массива, так как отсчет идет от "0".
Ну, другим будет как шпаргалка, если наткнутся на то же самое :smile:
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Применение UBound($array) я считаю более оправданно и удобно нежели $array[0], т.к.
разные функции по разному выдают массив-результат.
$array[0] - иногда это кол-во элементов массива ,
а иногда это Сам элемент (как у тебя).

Для простоты понимания :
UBound($array) -1 - это ИНДЕКС последнего элемента любого массива
 
Верх