Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> табуляция или пробелы 
V
    Опции темы
hagerds
Дата 5.4.2012, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 12.12.2011

Репутация: нет
Всего: нет



добрый день. 
у меня такая проблема! не могу разобраться с табуляциями. не получается кусок проги!

Есть N строк. Мы знаем длину максимальной строкми в данном случае maxLengthString = "5". Добавляем к каждой строке пробелы и в конце строки выводим символ "|" , так чтобы они образовывали вертикальную линию.

Реализовал это с помощью добовления очередного пробела в строку вот так:

Код

public class SrtingFilling {
    
    public static void main(String[] args) {
        
        int maxLengthString = 0;
        
        MyString[] arrayString = new MyString[5];
        
        arrayString[0] = new MyString("a");
        arrayString[1] = new MyString("ab");
        arrayString[2] = new MyString("abc");
        arrayString[3] = new MyString("abcd");
        arrayString[4] = new MyString("abcde");
        
        SrtingFilling array = new SrtingFilling();
        
        maxLengthString = array.getMaxLengthString(arrayString, maxLengthString);
        
        array.getArrayWithSpace(arrayString,  maxLengthString);
        
        array.display(arrayString);
        
    }
    
    private int getMaxLengthString(MyString[] arrayString, int maxLengthString) {
        for(MyString str: arrayString){
            if(maxLengthString < str.getString().length()) {
                maxLengthString = str.getString().length();
            }
        }
        return maxLengthString;
    }
    
    private void getArrayWithSpace(MyString[] arrayString, int maxLengthString) {
        
        int difference = 0;
        
        for (MyString str: arrayString) {
            str.setString(
                    getStringWithSpace(difference, maxLengthString, str.getString()));
        }
        
    }
    
    private String getStringWithSpace(int difference, int maxLengthString, String str ) {
        difference = maxLengthString - str.length();
        
        StringBuffer byff = new StringBuffer(str);
        
        for (int i = 0; i < difference; i++) {
            byff.append(' ');
        }
        byff.append('|');
        
        return byff.toString();
    }
    
    private void display(MyString[] arrayString) {
        for (MyString out : arrayString) {
            System.out.println(out.getString());
        }
    }
}

class MyString {
    
    private String string;

    public MyString(String line) {
        this.string = line;
    }
    
    public String getString() {
        return string;
    }
    
    public void setString(String line) {
        string = line;
    }
}


Как можно дабиться такого результата с добавлением табуляций , а не пробелов? smile 
За рание благодарю!

Добавлено через 4 минуты и 38 секунд
Извеняюсь ошибся темой. как можно удалить эту тему?
PM MAIL   Вверх
Mirkes
Дата 5.4.2012, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 586
Регистрация: 18.8.2011
Где: Красноярск

Репутация: 2
Всего: 17



О каком выравнивании в колонку идет речь? Поясню. Если на экране, то результат сильно зависит от выбранного шрифта. Если в текстовом файле, то нет проблем. Стандартно считается что горизонтальная табуляция начинается с позиции 8i, где i - целое число. Но если просматривать этот текстовый файл в блокноте, то все опяь зависит от шрифта.


--------------------
Mirkes
PM MAIL   Вверх
hagerds
Дата 8.4.2012, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 12.12.2011

Репутация: нет
Всего: нет



Кажется понял почему не получается. Табуляция на самом деле содержет не 4 а 8 символов пробелов. (почемуто)! 
проблему решил так:
  •  Делим максимальную длину строки на число такбуляций (тобиш 8.0).
  •  Остаток от деления округляем в меньшую сторону.
  •  Делим текущую длину строки на число такбуляций (тобиш 8.0).
  •  Остаток от деления округляем в меньшую сторону.
  •  Перезаписываем сторки.
Кто не понял как это делается смотри пример приведённый ниже

Пример. Выравнивание строк при помощи табуляции.

Код


public class SrtingFilling {

    
    public static void main(String[] args) {
        
        int maxLengthString = 0;
        
        MyString[] arrayString = new MyString[5];
        
        arrayString[0] = new MyString("a");
        arrayString[1] = new MyString("ab");
        arrayString[2] = new MyString("abc");
        arrayString[3] = new MyString("abcd");
        arrayString[4] = new MyString("abcde");
        
        SrtingFilling array = new SrtingFilling();
        
        maxLengthString = array.getMaxLengthString(arrayString, maxLengthString);
        
        array.getArrayWithSpace(arrayString,  maxLengthString);
        
        array.display(arrayString);
        
    }
    
    private int getMaxLengthString(MyString[] arrayString, int maxLengthString) {
        for(MyString str: arrayString){
            if(maxLengthString < str.getString().length()) {
                maxLengthString = str.getString().length();
            }
        }
        return maxLengthString;
    }
    
    public void getArrayWithSpace(MyString[] arrayString, int maxLengthString) {
        
        double tabulationInMaxLine = maxLengthString / 8.0;
        int floorTabulationInMaxLine = (int) Math.floor(tabulationInMaxLine);
        
        
        for (MyString str: arrayString) {
            str.setString(
                    getStringWithSpace(str.getString(), floorTabulationInMaxLine));
        }
        
    }
    
    public String getStringWithSpace(String string, int floorTabulationInMaxLine) {
        
        int difference = 0;
        
        double tabulationInCurentName = string.length() / 8.0;
        int floorTabulationInCurentName = (int) Math.floor(tabulationInCurentName);
        
        difference = floorTabulationInMaxLine - floorTabulationInCurentName;
        
        StringBuffer byff = new StringBuffer(string);
        
        for (int i = 0; i < difference; i++) {
            byff.append("\t");
        }
        byff.append("\t|");
        
        return byff.toString();
    }
    
    private void display(MyString[] arrayString) {
        for (MyString out : arrayString) {
            System.out.println(out.getString());
        }
    }
}

class MyString {
    
    private String string;

    public MyString(String line) {
        this.string = line;
    }
    
    public String getString() {
        return string;
    }
    
    public void setString(String line) {
        string = line;
    }
}



Всем большое спасибо за помощь.

Добавлено @ 10:48
только у меня есть вопрос. 

Я прогаю в Eclipse. Там в перспективе JAVA длина табуляции составляет 4 символа пробелов. при выводе на консоль почемуто выскакивает 8 символов.

Вопрос почему и с чем это связанно?


Это сообщение отредактировал(а) hagerds - 8.4.2012, 10:55
PM MAIL   Вверх
jk1
Дата 8.4.2012, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 21
Всего: 75



Нельзя рассчитывать на постоянную длину табуляции. Разные текстовые редакторы и устройства вывода могут отводить под табуляцию не 8, а 4 или даже 2 знакоместа. 


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
Mirkes
Дата 8.4.2012, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 586
Регистрация: 18.8.2011
Где: Красноярск

Репутация: 2
Всего: 17



Цитата(jk1 @ 8.4.2012,  12:15)
Нельзя рассчитывать на постоянную длину табуляции. Разные текстовые редакторы и устройства вывода могут отводить под табуляцию не 8, а 4 или даже 2 знакоместа.

Насколько я знаю, все устройства вывода понимают под табуляцией именно 8 знакомест. 
А вот текстовые редакторы, текстовые процессоры, IDE и т.д. часто назначают символу горзонтальной табуляции свой смысл. Word, например позволяет установить различный набор табуляций в сантиметрах.
Кроме того, при отображении в пропорциональных шрифтах даже соблюдение правила о 8 знакоместах не гарантирует ровной колонки:

...    |
ШШШ    |

В двух строчках выше в каждой по три символа и табуляция. Результат - на лице  smile 


--------------------
Mirkes
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0594 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.