проблема, заставляющая полиморфизм побеждать их переключатель/операторы выбора

Я использовал бы !}uniq, но который только работает, при отсутствии пустых строк.

Для каждой строки в использовании файла: :1,$!uniq.

5
задан Community 23 May 2017 в 12:29
поделиться

3 ответа

Возможно, здесь что-то не хватает, но вместо оператора switch , что не так с

((Command)myMap.get(instructionFromString)).execute();

Если инструкцияFromString представляет собой char , преобразование его в String перед поиском по карте, иначе используйте ключи Character на вашей карте.

Кроме того, если вы используете общую карту Java 5, вы можете удалить приведение на Команда . Очищенная версия будет выглядеть так:

private Map<Character, Command> myMap = new HashMap<Character, Command>();
myMap.put('A', new CommandA());
myMap.put('B', new CommandB());
myMap.put('C', new CommandC());
myMap.put('D', new CommandD());

, за которой следует:

char instructionFromString = ....
myMap.get(instructionFromString).execute();
14
ответ дан 18 December 2019 в 13:16
поделиться

Помимо уже заявленных ответов об использовании Vector, Vector также имеет множество методов перечисления и извлечения элементов, которые отличаются от интерфейса List, и разработчиков (особенно тех, кто изучал Java до 1.2) могут использовать их, если они есть в коде. Хотя перечисления работают быстрее, они не проверяют, была ли коллекция изменена во время итерации, что может вызвать проблемы, и, учитывая, что вектор может быть выбран для ее синхронизации - с сопутствующим доступом из нескольких потоков, это делает эту проблему особенно опасной. Использование этих методов также связывает большой объем кода с Vector, так что будет нелегко заменить его другой реализацией List.

Вы хотите, чтобы если кто-то набрал URL страницы прямо в браузере и добавил к нему ? Id = x , вы должны направить его на соответствующую страницу, выбрать соответствующую строку и заполнить FormView на основе выбранная запись.

Что ж, если это так, я кое-что сделал, но позвольте мне заранее предупредить, что это не очень элегантно и сейчас 2:30 утра, поэтому, пожалуйста, не смейтесь.

Предположение: - В представленном решении поле DataKeyNames установлено как Первичный ключ исходной таблицы. Выбранные строки сортируются по этому ключу. Я использую SubSonic 3 для общения с SQL Server 2005 Express DB (по совпадению, это мой первый проект SS3, очень занят в офисе, чтобы попробовать его).

Определение таблицы выглядит следующим образом:

Create Table StudentsTable
( EnrolmentNumber int not null identity primary key, 
  StudentName nvarchar(50) not null)

aspx:

<asp:GridView ID="gvStudents" runat="server" AllowPaging="True" PageSize="3"
 OnSelectedIndexChanged="GridRowChanged" OnPageIndexChanging="GridPageChanging" 
    DataKeyNames="EnrolmentNumber">
    <RowStyle BackColor="LightBlue" />
    <AlternatingRowStyle BackColor="LightCoral" />
    <Columns>
        <asp:TemplateField ShowHeader="False">
            <ItemTemplate>
                <asp:LinkButton ID="LinkButton1" runat="server"  
                    CommandName="Select" Text="Select"></asp:LinkButton>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
    <SelectedRowStyle BackColor="Red" BorderColor="Yellow" />
</asp:GridView>

<asp:FormView ID="fvSubjects" runat="server" AllowPaging="false" 
    Caption="Student" CaptionAlign="Left">
    <ItemTemplate>
        <table>
            <tr>
                <td>Enrolment Number</td>
                <td><asp:Label ID="lblEN" runat="server" 
                     Text=<%# Eval("EnrolmentNumber") %> /></td>
            </tr>
            <tr>
                <td>Student Name</td>
                <td><asp:Label ID="lblName" runat="server" 
                     Text=<%# Eval("StudentName") %> /></td>
            </tr>
        </table>
    </ItemTemplate>
</asp:FormView>

Код C # (сдержите смех):

private IList<StudentsTable> students;

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        LoadData();
            CheckQueryString(students);
    }
}

private void LoadData()
{
    students = StudentsTable.All().ToList();
    gvStudents.DataSource = students;
    gvStudents.DataBind();
}

private void CheckQueryString(IList<StudentsTable> students)
{
    if (!Request.QueryString.HasKeys() || 
       string.IsNullOrEmpty(Request.QueryString["erno"]))
    {
        return;
    }

    var erno = Request.QueryString["erno"];
    int key;
    if (!int.TryParse(erno, out key))
        return;

    for (var i = 0; i < students.Count; i++)
    {
        if (students[i].EnrolmentNumber == key)
        {
            SetPageSize(students, i);

            break;
        }
    }
}

private void SetPageSize(IList<StudentsTable> students, int i)
{
    var ps = gvStudents.PageSize;
    var cp = i / ps;
    var ridx = i - ps - 1;

    var pageEvent = new GridViewPageEventArgs(cp);
    GridPageChanging(null, pageEvent);
    gvStudents.SelectedIndex = ridx;
    GridRowChanged(null, EventArgs.Empty);
}

protected void GridRowChanged(object sender, EventArgs e)
{
    var rIdx = gvStudents.SelectedIndex;
    if (rIdx < 0) return;

    var key = gvStudents.DataKeys[rIdx];
    var lst= StudentsTable.Find(x => x.EnrolmentNumber == (int)key.Value);
    SetFormView(lst);
}

private void SetFormView(IList<StudentsTable> student)
{
    fvSubjects.DataSource = student;
    fvSubjects.DataBind();
}

protected void GridPageChanging(object sender, GridViewPageEventArgs e)
{
    var p = e.NewPageIndex;
    if (p > gvStudents.PageCount)
        p = gvStudents.PageCount - 1;
    gvStudents.PageIndex = p;

    LoadData();
}

PS: - Ошибка, если вы поместите идентификатор последней записи.

0
ответ дан 18 December 2019 в 13:16
поделиться

Мне нравится ответ Скаффмана. Я только хочу добавить еще:

Для наименования ваших команд вы можете использовать более простой шаблон. Например, вы можете использовать имя команды по умолчанию.

  • В общем случае, тем меньше набирать. Это исключает ошибки.
  • Если имя отличается, вы все равно настраиваете карту для этого конкретного случая.

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

  • Аннотации для класса, в котором указывается имя команды (со значением по умолчанию, равным имени класса).
  • Конфигурация Spring уже является такой большой картой и напрямую доставляет соответствующий объект, со многими другими услуги, доступные в процессе.
  • Перечисления Java также естественным образом связывают имя с объектом. Кроме того, они позволяют выполнять проверку завершения и времени компиляции в вашей среде IDE, а также выполнять «справочный поиск» и другие полезности.
0
ответ дан 18 December 2019 в 13:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: