精华内容
下载资源
问答
  • 列表框中的项目保存在一个数组中
    千次阅读
    2020-07-08 05:54:52

    java数组实现队列

    什么是队列? (What is a Queue?)

    Queue is a special type of data structure, which is designed to hold elements before processing and process elements in a FIFO (first-in-first-out) manner. It’s part of java collections framework. In this tutorial, we will learn Queue implementation in Java using an array.

    队列是一种特殊类型的数据结构,旨在在处理和处理元素之前以FIFO(先进先出)的方式保存元素。 它是java collections框架的一部分。 在本教程中,我们将学习如何使用数组在Java中实现Queue。

    基本队列功能 (Basic Queue Functions)

    A Queue must have the following functions:

    队列必须具有以下功能:

    • enqueue(obj) – insert element to the queue.

      enqueue(obj) –将元素插入队列。
    • dequeue() – remove and return the least recent item from the queue.

      dequeue() –从队列中删除并返回最近的项目。
    • isEmpty() – returns true if the queue is empty, else false.

      isEmpty() –如果队列为空,则返回true,否则返回false。

    Java中的队列实现 (Queue Implementation in Java)

    We can implement basic Queue functions using an array.

    我们可以使用数组实现基本的Queue函数。

    Here is the complete code to implement a Queue in Java.

    这是在Java中实现队列的完整代码。

    package com.journaldev.java;
    
    public class MyQueue {
    
    	public static final int DEFAULT_SIZE = 5;
    
    	private Object data[];
    
    	private int index;
    
    	public MyQueue() {
    		data = new Object[DEFAULT_SIZE];
    	}
    
    	public MyQueue(int size) {
    		data = new Object[size];
    	}
    
    	public boolean isEmpty() {
    		return index == 0;
    	}
    
    	public void enqueue(Object obj) throws Exception {
    		if (index == data.length - 1) {
    			throw new Exception("Queue is full. Dequeue some objects");
    		}
    		this.data[index] = obj;
    		this.index++;
    	}
    
    	public Object dequeue() throws Exception {
    		if (isEmpty())
    			throw new Exception("Queue is empty");
    		Object obj = this.data[0];
    		for (int i = 0; i < this.index - 1; i++) {
    			data[i] = data[i + 1];
    		}
    		this.index--;
    		return obj;
    
    	}
    }

    Important Points

    重要事项

    • There are two constructors – one to create a Queue with default size, the other one is used to specify the queue size.

      有两个构造函数–一个用于创建默认大小的Queue,另一个用于指定队列的大小。
    • We are using a private integer variable “index” to manage the queue elements.

      我们正在使用私有整数变量“ index”来管理队列元素。
    • We are using an Object array so that we can hold any type of object in the Queue. We can use generics here too but I am avoiding that to keep the program simple.

      我们正在使用对象数组,以便可以在队列中保存任何类型的对象。 我们也可以在此处使用泛型,但为了避免使程序保持简单,我避免这样做。
    • If the queue is full, the enqueue() will throw an exception with proper message.

      如果队列已满,则enqueue()会引发带有适当消息的异常。
    • If the queue is empty and we call the dequeue() function, an exception is raised.

      如果队列为空,并且我们调用dequeue()函数,则会引发异常。

    Implementation Limitations
    The Queue methods are not synchronized and it’s not thread-safe. There is a chance of data inconsistency if you use this implementation in a multi-threaded environment.

    实施局限性
    Queue方法未同步,并且不是线程安全的。 如果在多线程环境中使用此实现,则可能会导致数据不一致。

    测试程序以检查队列实施 (Test Program to Check Queue Implementation)

    Let’s test our queue implementation with some calls to enqueue() and dequeue() functions.

    让我们通过对enqueue()和dequeue()函数的一些调用来测试我们的队列实现。

    MyQueue queue = new MyQueue();
    queue.enqueue("1");
    System.out.println(queue.dequeue());
    
    queue.enqueue("2");
    queue.enqueue("3");
    queue.enqueue("4");
    System.out.println(queue.dequeue());
    
    queue.enqueue("5");
    queue.enqueue("6");
    // queue.enqueue("7");
    // queue.enqueue("8");

    Output:

    输出:

    1
    2

    If you uncomment the last two lines, the queue will get full and an exception will be raised.

    如果取消注释最后两行,则队列将已满,并且将引发异常。

    Exception in thread "main" java.lang.Exception: Queue is full. Dequeue some objects
    	at com.journaldev.java.MyQueue.enqueue(MyQueue.java:25)
    	at com.journaldev.java.MyQueue.main(MyQueue.java:56)

    结论 (Conclusion)

    A Queue is one of the simplest data structures. We can implement it using an array or a list.

    队列是最简单的数据结构之一。 我们可以使用数组或列表来实现它。

    翻译自: https://www.journaldev.com/104/queue-implementation-java-array

    java数组实现队列

    更多相关内容
  • 内容 + “|” ' 添加“|”是为了分开每组合框项目,读入配置后分割为文本型数组!  写配置项 (取运行目录 () + “\组合框存储.ini”, “组合框存储”, “组合框存储”, 组合框项目存储)  组合框1...
  • 进入正题,我们都知道,自绘列表框其实就是绘制一个个收尾连接一起的矩形,然后矩形里填充各种数据,图标、标题、进度条...然后滚动显示就是把各个矩形向上或向下偏移 这样一个列表框就完成了。 不过这样绘制出来...
  • 列表框控件(ListBox)的常用属性 属性 说明 (Name) 列表框控件的名称 Appearance 是否用立体效果绘制,取值为:...列表框中项目可以单列垂直显示,也可以水平单行或多 Cloumns 列列表显示。取值为:0 垂直单列列表 ...

    💗 大家好🤗🤗🤗,我是左手の明天!💗

    📆  最近更新:2022 年 5 月 24 日,左手の明天的第 244 篇原创博客

    📚 更新于专栏:Matlab GUI编程技巧


    目录

    🚩listbox控件用法和属性

    🚩 回调函数

    🚩添加/删除列表框中的项目

    ⭐️删除ListBox的某一项

    ⭐️添加ListBox的某一项

    ⭐️删除“空”项中的simpliest办法

    🚩listbox读取/添加不重复数据

    ⭐️读取数据

    ⭐️写入数据

    🚩创建列表框组件:uilistbox

    ⭐️语法

    ⭐️输入参数

    parent - 父容器

    Value - 值

    Items - 列表框项目

    ItemsData - 与 Items 属性值的每个元素关联的数据

    Multiselect - 多项目选择

    ValueChangedFcn - 值更改函数

    Position - 列表框的位置和大小

    ⭐️创建列表框

    ⭐️设置和访问列表框属性值 

    ⭐️显示列表框选项

    ⭐️显示列表框数据

    ⭐️允许选择多个项目的列表框


    🚩listbox控件用法和属性

    列表框是一种 UI 组件,用于显示列表中的项目。可通过属性控制列表框的外观和行为。使用圆点表示法引用特定的对象和属性:

    fig = uifigure;
    list = uilistbox(fig);
    list.Items = {'Red','Green','Blue'};

    属性列表:

    • Value - 值
    • Items - 列表框项目
    • ItemsData - 与 Items 属性值的每个元素关联的数据
    • FontName - 字体名称
    • FontSize - 字体大小
    • FontWeight - 字体粗细

    字体粗细,指定为下列值之一:

    1.  'normal' - 特定字体定义的默认粗细
    2. 'bold' - 字符轮廓比 'normal' 粗 并非所有字体都有加粗字体。对于非加粗字体,指定 'bold' 会得到普通字体。

    • FontAngle - 字体角度

    字体角度,指定为 'normal' 或 'italic'。并非所有字体都有倾斜字体角度。对于无斜体字体,指定 'italic' 后会使用常规字体角度。

    • FontColor - 字体颜色

    字体颜色,指定为 RGB 三元组、十六进制颜色代码或下表中列出的选项之一。

    RGB 三元组和十六进制颜色代码对于指定自定义颜色非常有用。

    1.  RGB 三元组是包含三个元素的行向量,其元素分别指定颜色中红、绿、蓝分量的强度。强度值必须位于 [0,1] 范围内,例如 [0.4 0.6 0.7]
    2. 十六进制颜色代码是字符向量或字符串标量,以井号 (#) 开头,后跟三个或六个十六进制数字,范围可以是 0 到 F。这些值不区分大小写。因此,颜色代码   '#FF8800'   与   '#ff8800''#F80' 与 '#f80' 是等效的。

     下表列出了命名颜色选项、等效 RGB 三元组和十六进制颜色代码。

    颜色名称短名称RGB 三元组十六进制颜色代码
    'red''r'[1 0 0]'#FF0000'
    'green''g'[0 1 0]'#00FF00'
    'blue''b'[0 0 1]'#0000FF'
    'cyan''c'[0 1 1]'#00FFFF'
    'magenta''m'[1 0 1]'#FF00FF'
    'yellow''y'[1 1 0]'#FFFF00'
    'black''k'[0 0 0]'#000000'
    'white''w'[1 1 1]'#FFFFFF'
    • BackgroundColor - 背景色
    • Visible - 可见性状态

    可见性状态,指定为 'on' 或 'off',或者指定为数值或逻辑值 1 (true) 或 0 (false)。值 'on' 等效于 true'off' 等效于 false

    1.  'on' - 显示对象。
    2.  'off' - 隐藏对象而不删除它。您仍然可以访问不可见 UI 组件的属性。
    •  Multiselect - 多项目选择
    • Enable - 工作状态
    • ContextMenu - 上下文菜单
    • Position - 列表框的位置和大小
    • InnerPosition - 列表框的内部位置和大小
    • OuterPosition - 列表框的外部位置和大小
    • Layout - 布局选项

    布局选项,指定为 GridLayoutOptions 对象。此属性为网格布局容器的子级组件指定选项。如果组件不是网格布局容器的子级(例如,它是图窗或面板的子级),则此属性为空且不起作用。但是,如果组件是网格布局容器的子级,则可以通过在 GridLayoutOptions 对象上设置 Row 和 Column 属性,将组件放置在网格的所需行和列中。

    例如,以下代码将一个列表框放置在其父网格的第三行第二列中。

    g = uigridlayout([4 3]);
    list = uilistbox(g);
    list.Layout.Row = 3;
    list.Layout.Column = 2;

    要使该列表框跨多个行或列,请将 Row 或 Column 属性指定为二元素向量。例如,此列表框跨列 2 到 3

    list.Layout.Column = [2 3];
    • Type - 图形对象的类型
    • Tag - 对象标识符
    • UserData - 用户数据

    🚩 回调函数

    (1)Callback - 用户与控件交互时执行的回调函数

    Note:''(默认) | 函数句柄 | 元胞数组 | 字符串

    此函数使控件响应用户输入,例如按钮点击、滑动条移动或复选框选中。

    (2)CreateFcn - 控件创建函数

    Note:函数句柄 | 元胞数组 | 字符串

    该属性指定要在 MATLAB 创建 uicontrol 时执行的回调函数。MATLAB 在执行 CreateFcn 回调之前初始化所有的控件属性值。如果不指定 CreateFcn 属性,则 MATLAB 执行默认的创建函数。

    CreateFcn 代码中使用 [gcbo] 函数可以获得创建的控件的句柄。

    对现有控件设置 CreateFcn 属性没有任何作用。

    (3)DeleteFcn - 控件删除函数

    Note:函数句柄 | 元胞数组 | 字符串

    DeleteFcn 属性指定要在 MATLAB 删除控件时(例如,最终用户删除图形时)执行的回调函数。MATLAB 在销毁控件的属性之前执行 DeleteFcn 回调。如果不指定 DeleteFcn 属性,则 MATLAB 执行默认的删除函数。

    在 DeleteFcn 代码中使用 gcbo 函数以获得删除的控件的句柄。

    (4)ValueChangedFcn - 值更改函数

    当用户从列表框中选择不同的项目时,将会执行此回调函数。如果以编程方式更改 Value 属性设置,将不会执行此回调函数。

    此回调函数可以访问有关用户与列表框的交互的特定信息。MATLAB 将 ValueChangedData 对象中的此信息作为第二个参数传递给回调函数。在 App 设计工具中,该参数名为 event。您可以使用圆点表示法查询对象属性。例如,event.PreviousValue 返回列表框的上一个值。ValueChangedData 对象不可用于指定为字符向量的回调函数。

    下表列出了 ValueChangedData 对象的属性。

    属性
    Value列表框在 App 用户最近一次与它交互之后的值
    PreviousValue列表框在 App 用户最近一次与它交互之前的值
    Source执行回调的组件
    EventName'ValueChanged'

    🚩添加/删除列表框中的项目

    实现的功能

    matlab中尝试创建一个列表框,可以动态添加或删除项目

    需要用到listboxhandle,可以用findobj来获得

    hMyListBox = findobj('type', 'listbos'); %如果你的GUI上只有一个listbox的话

    ⭐️删除ListBox的某一项

    oldString = get(hMyListBox, 'String'); 
    curPos = get(hMyListBox, 'Value'); 
    oldString(curPos) = []; 
    set(hMyListBox, 'String', oldString);

    当然也可以通过以下方式实现:

    n=get(handles.listbox,'value'); %获取选中的行号
    str=get(handles.listbox,'string'); %获取列表中的所有数据
    m=size(str1,1);
    k=0;
    for i=1:m
        for j=1:size(n,2)
            if(i~=n(j))
                k=k+1;
                str1(k,:)=str(i,:);
            end
        end
    end
    set(handles.listbox,'string',str1);

    ⭐️添加ListBox的某一项

    newItem={'This is a new string'}; 
    oldString = get(hMyListBox, 'String'); 
    curPos = get(hMyListBox, 'Value'); 
    numStrings = length(oldString); 
    newString = {oldString(1:curPos) newItem oldString(curPos:numStrings)}; 
    set(hMyListBox, 'String', newString);

    ⭐️删除“空”项中的simpliest办法

    删除“空”项中的simpliest办法就是更新listbox字符串与remainig项目。

    有三种可能性:

    • 第一个元素已被删除:新列表将为upd_list={existingItems{2:end}}
    • 最后一个元素已被删除:新列表将为upd_list={existingItems{1:end-1}}
    • ans中间元素已被删除:新列表将为upd_list={existingItems{1:selectedId-1} existingItems{selectedId+1:end}}

    还可以检查列表的所有元素都被删除,在这种情况下,禁用“删除”pushbutton;在这种情况下,您必须在“添加”callback中启用它。

    btnDeleteLabel_Callback相关代码可以为如下:

    % --- Executes on button press in btnDeleteLabel. 
    function btnDeleteLabel_Callback(hObject, eventdata, handles) 
    % hObject handle to btnDeleteLabel (see GCBO) 
    % eventdata reserved - to be defined in a future version of MATLAB 
    % handles structure with handles and user data (see GUIDATA) 
    
    selectedId = get(handles.listbox_labels, 'Value')  % get id of selectedLabelName 
    existingItems = get(handles.listbox_labels, 'String') % get current listbox list 
    % 
    % It is not necessary 
    % 
    % existingItems{selectedId} = []     % delete the id 
    
    % Identify the items: if in the list only one ites has been added the 
    % returned list is a char array 
    if(class(existingItems) == 'char') 
        upd_list='' 
        set(handles.listbox_labels, 'String', upd_list) 
    else 
        % If the returned list is a cell array there are three cases 
        n_items=length(existingItems) 
        if(selectedId == 1) 
         % The first element has been selected 
         upd_list={existingItems{2:end}} 
        elseif(selectedId == n_items) 
         % The last element has been selected 
         upd_list={existingItems{1:end-1}} 
         % Set the "Value" property to the previous element 
         set(handles.listbox_labels, 'Value', selectedId-1) 
        else 
         % And element in the list has been selected 
         upd_list={existingItems{1:selectedId-1} existingItems{selectedId+1:end}} 
        end 
    end 
    % Update the list 
    set(handles.listbox_labels, 'String', upd_list)  % restore cropped version of label list 
    
    % Disable the delete pushbutton if there are no more items 
    existingItems = get(handles.listbox_labels, 'String') 
    if(isempty(existingItems)) 
        handles.btnDeleteLabel.Enable='off' 
    end 

    🚩listbox读取/添加不重复数据

    ⭐️读取数据

    • 如果列表只有1个数据,则读取格式为char;
    • 如果列表有多于1个数据,则读取格式为cell;

    因此,为了统一,使用了str to cell转换函数cellstr()

    print_list = cellstr(get(handles.listbox2,'string'));

    ⭐️写入数据

    将new_print_list写入listbox中

    set(handles.listbox,'string',new_print_list);

    缺陷:以上方式会清空原来listbox中的数据,直接用new_print_list覆盖。

    如果想要保留原来listbox中的数据,而且满足 “如果新数据已经在列表中,则忽略;否则就加到列表中”,那么可以改为以下代码:

    % 先读取原list中的数据
    print_list = cellstr(get(handles.listbox,'string'));
    
    % 如果new_print_list是新数据,则加入列表;否则不加入
    if ~strcmp(cur_str, print_list)
    	new_print_list = [print_list; cellstr(cur_str)];
    	set(handles.listbox,'string',new_print_list);
    end

    🚩创建列表框组件:uilistbox

    ⭐️语法

    • lb = uilistbox :在新图窗窗口中创建一个列表框,并返回 ListBox 对象。
    • lb = uilistbox(parent) :在指定的父容器中创建列表框。父容器可以是使用uifigure函数创建的 Figure 或其子容器之一。
    • lb = uilistbox(___,Name,Value) :使用一个或多个 Name,Value 对组参数指定 ListBox 属性。

    ⭐️输入参数

    parent - 父容器

    指定为使用 uifigure 函数创建的 Figure 对象或其子容器之一:TabPanelButtonGroup 或 GridLayout。如果不指定父容器,MATLAB 会调用 uifigure 函数创建新 Figure 对象充当父容器。

    Value - 值

    指定为 Items 数组或 ItemsData 数组的元素,或指定为空元胞数组。默认情况下,Value 是 Items 中的第一个元素。

    要不指定任何选择,请将 Value 设置为空元胞数组。

    将 Value 指定为 Items 的元素,即可选择与该元素匹配的列表项。如果 ItemsData 非空,则 Value 必须设置为 ItemsData 的元素,而列表框将选中列表中的关联项目。

    Items - 列表框项目

    指定为字符向量元胞数组、字符串数组或一维分类数组。允许重复的元素。列表框显示的选项与 Items 数组中的元素数量一样多。如果将此属性指定为分类数组,MATLAB 将使用数组中的值,而不是完整的类别集。

    ItemsData - 与 Items 属性值的每个元素关联的数据

    与 Items 属性值的每个元素关联的数据,指定为 1×n 数值数组或 1×n 元胞数组。允许重复的元素。

    例如,如果您将 Items 值设置为员工姓名,则可以将 ItemsData 值设置为对应的员工 ID 号。ItemsData 值对 App 用户不可见。

    如果 ItemsData 值和 Items 值中的数组元素数量不匹配,将发生以下情况之一:

    • 如果 ItemsData 值为空,则 Items 值的所有元素都呈现给 App 用户。

    • 如果 ItemsData 值中的元素数大于 Items 值,则 Items 值的所有元素都呈现给 App 用户。MATLAB 将忽略多余的 ItemsData 元素。

    • 如果 ItemsData 值非空,但元素数少于 Items 值,只将在 ItemsData 值中具有对应元素的 Items 值的元素呈现给 App 用户。

    示例: {'One','Two','Three'}

    示例: [10 20 30 40]

    Multiselect - 多项目选择

    多项目选择,指定为 'off' 或 'on',或者指定为数值或逻辑值 1 (true) 或 0 (false)。值 'on' 等效于 true'off' 等效于 false。因此,您可以使用此属性的值作为逻辑值。

    ValueChangedFcn - 值更改函数

    当用户从列表框中选择不同的项目时,将会执行此回调函数。如果以编程方式更改 Value 属性设置,将不会执行此回调函数。

    此回调函数可以访问有关用户与列表框的交互的特定信息。MATLAB 将 ValueChangedData 对象中的此信息作为第二个参数传递给回调函数。在 App 设计工具中,该参数名为 event。您可以使用圆点表示法查询对象属性。例如,event.PreviousValue 返回列表框的上一个值。ValueChangedData 对象不可用于指定为字符向量的回调函数。

    下表列出了 ValueChangedData 对象的属性。

    属性
    Value列表框在 App 用户最近一次与它交互之后的值
    PreviousValue列表框在 App 用户最近一次与它交互之前的值
    Source执行回调的组件
    EventName'ValueChanged'

    Position - 列表框的位置和大小

    列表框相对于父容器的位置和大小,指定为向量 [left bottom width height]。下表介绍该向量中的每个元素。

    元素说明
    left父容器的内部左边缘与列表框的外部左边缘之间的距离
    bottom父容器的内部下边缘与列表框的外部下边缘之间的距离
    width列表框的左右外部边缘之间的距离
    height列表框的上下外部边缘之间的距离

    所有测量值都以像素为单位。

    Position 值相对于父容器的可绘制区域。可绘制区域是指容器边框内的区域,不包括装饰元素(如菜单栏或标题)所占的区域。

    示例: [100 100 100 200]

    ⭐️创建列表框

    在图窗窗口中创建一个列表框。

    fig = uifigure('Position', [100 100 300 250]);
    lbx = uilistbox(fig);

    ⭐️设置和访问列表框属性值 

    创建一个列表框。

    fig = uifigure;
    lbx = uilistbox(fig);

    确定列表框是否允许多选。

    multi = lbx.Multiselect
    
    multi =
    
         off

    允许多选。

    lbx.Multiselect = 'on';

    ⭐️显示列表框选项

    创建一个列表框,以便在用户选择列表中的某个项目时执行相应操作。

    将以下代码以 selectlistbox.m 文件保存到 MATLAB 路径上。

    此代码将创建一个 App,其中包含一个列表框和一个文本区域。ValueChangedFcn 回调将更新文本区域以显示列表框选项。

    function selectlistbox
    
    fig = uifigure('Position',[100 100 350 275]);
    
    % Create text area
    txt = uitextarea(fig,...
        'Position',[125 90 100 22],...
        'Value','First');
    
    % Create list box
    lbox = uilistbox(fig,...
        'Position',[125 120 100 78],...
        'Items',{'First','Second','Third'},... 
        'ValueChangedFcn', @updateEditField); 
    
    % ValueChangedFcn callback
    function updateEditField(src,event) 
        txt.Value = src.Value;
    end
    
    end

    运行 selectlistbox 并从列表中选择一个选项。

    ⭐️显示列表框数据

    创建一个列表框,其中的每个项目都有关联的数值。当用户选择列表框中的项目时,编辑字段将显示关联的数值。

    将以下代码以 dataselection.m 文件保存到 MATLAB 路径上。此代码将创建一个 App,其中包含一个列表框和一个数值编辑字段。列表中的每一项都有与其关联的温度。当用户选择列表中的项目时,ValueChangedFcn 回调将在编辑字段中显示相应的温度。

    function dataselection
    fig = uifigure('Position',[100 100 350 275]);
    
    % Create Numeric Edit Field
    ef = uieditfield(fig,'numeric',...
        'Position',[125 90 100 22]);
    
    % Create List Box
    lbox = uilistbox(fig,...
        'Items', {'Freezing', 'Warm', 'Hot', 'Boiling'},...
        'ItemsData', [0, 25, 40, 100],...
        'Position',[125 120 100 78],...
        'ValueChangedFcn', @selectionChanged);
    
    % ValueChangedFcn callback
    function selectionChanged(src,event)
        % Display list box data in edit field
        ef.Value = src.Value;
    end
    
    end

    运行 dataselection 并选择列表中的项目。数值编辑字段将更新以反映与所选项相关联的温度。

    ⭐️允许选择多个项目的列表框 

    创建一个 App,其中包含一个列表框,允许选择多个项目。编写 ValueChangedFcn 回调以便在列表框下方的文本区域中显示所选项。

    将以下代码以 multiselect.m 文件保存到 MATLAB 路径上。

    function multiselect
    fig = uifigure('Position',[100 100 350 275]);
    
    % Create Text Area
    txt = uitextarea(fig,...
        'Position',[125 80 100 50]);
    
    % Create List Box
    lbox = uilistbox(fig,...
        'Position',[125 150 100 78],...
        'Multiselect','on',...
        'ValueChangedFcn',@selectionChanged);
    
    % ValueChangedFcn callback
    function selectionChanged(src,event)
        txt.Value = src.Value;
    end
    
    end

    运行 multiselect,然后从列表中选择项目。文本区域显示您选择的内容。


    🌟全文共9567个字,码字总结不易,老铁们来个三连:点赞、关注、评论🌟

    🌟作者:左手の明天🌟

    🌟原创不易,转载请联系作者并注明出处🌟

    展开全文
  • 正当项目即将完成之际,恰逢项目经路来了句,搜索我觉得高亮显示会更好一些,把这需求弄一下.恰同学少面年,跟项目经理争执了半天也没有结果.最后我不要你觉得,我要我觉得,惨败收场.此时心里面不知道多少???...

    日复一日,反反复复,终于完成了小程序的项目.。这篇文章我就对自己的项目中用到的array方法结合具体的功能进行综合的分析

    搜索区高亮的显示

    使用方法Str.replace()+正则+Array.map()

    正当项目即将完成之际,恰逢项目经路来了一句,搜索框我觉得高亮显示会更好一些,把这个需求弄一下.恰同学少面年,跟项目经理争执了半天也没有个结果.最后我不要你觉得,我要我觉得,惨败收场.此时心里面不知道多少个???what?.没办法,硬着头皮也得来呀.简单分析后,其实原理并不难

    原理:字符串替换

    基本想法就是字符串替换。现在的问题简化成了:如何把一段字符串中的指定的内容替换成另一个内容:

    var str = "abcdefgbefab"
    // 目标: 把str中的b全部换成<span>b</span>
    // 普通字符串替换:str.replace(目标字符串,要替换的字符串),它的返回值是替换之后的字符串,注意它不会修改原字符串。
    // 它的问题是,它只能替换一次。如上,我们有两个b需要替换,那又该怎么办呢?
    // - 循环
    // - 正则
    

    此时到这里以后,我觉得可以使用正则来进行解决

    <script>
            // 实现正则替换
            var str ="abdAd";
            var keywork = "ab"
            // 目标是:
            //     把所有的a替换成<span style="color:red">a</span>
            // 请开始你的表演
            // replace如果不用正则,只能换一次
            // var str1 = str.replace("a",'<span style="color:red">a</span>')
    
            // replace(正则,函数)
            // /a/gi :正则
            //      g表明要做全局匹配。只匹配出所有的子串。
            //      i表明匹配不分大小写。
            // new RegExp('a','gi'); 用构造器的方式来创建正则表达式就可以把
            //     第一个参数写成变量
            // 如果在字符串用正则匹配到了内容,则会去执行函数。
            // 函数的执行细节是:
            //  - 参数obj是匹配到的内容 
            //  - 返回值是替换之后的结果 
            var str1 = str.replace(new RegExp(keywork,'gi'),function(obj){
                console.log(obj)
                return '<span style="color:red">'+obj+'</span>'
            })
    
            console.log(str1); // '<span style="color:red">a</span>bAdd'
        </script>
    

    在计算属性中定义

    this.searchSuggestions是搜索是获取的数据是一个数组

    <script>
    ....
     computed: {
        // 补充一个计算属性对searchSuggestions中的数据做高亮
        cSearchSuggestions () {
          // 创建正则表达式
          const reg = new RegExp(this.keyword, 'gi')
          return this.searchSuggestions.map(str => {
            // 原来是:str
            // 替换成:对关键字进行高亮之后的字符串
            const str1 = str.replace(reg, function (obj) {
              return `<span style="color:red">${obj}</span>`
            })
            return str1
          })
        }
      },
    }
    </script>
    

    使用array.map返回的就是一个数组.所以此时只需要对当前的数组进行遍历就可以了

    但是问题又出现了

    我们替换的的是html,那么如何渲染 到小程序上哪?

    使用小程序的 rich-text组件 nodes后面跟的是需要渲染的数据

    <rich-text nodes="HTML字符串"></rich-text>
    

    此时就完成了搜索框的渲染
    效果图如下:
    在这里插入图片描述

    搜索历史记录

    使用方法:array.splice+array.unshift+array.indexOf

    搜索区域的历史记录涉及的东西也比较多.之前在做vue的项目中也比较常用.
    对于历史记录的用一个数组来进行保存,并且要做数据的持久化.所以里面也会用到Storage相关的api.因为使用的是uniapp进行开发的,所以相关的api进行查阅文档就可以了.开始进入正题吧.
    当项目经理找到我的时候,给我提了一个我需求.要求:点击的历史记录在被点击以后,选项要被提前.点击相关的选项要进入到相关的搜索结果区域
    以上就是需要.下面开始功能的完善
    在这里插入图片描述
    首先是关于数据重复的问题:当我们添加数组的时候,可以先进行判断.
    html结构

    <input type="text" @focus="changeColor" :placeholder="value"
    			@input="getKey" v-model="word"
    			@confirm="confirmSeach"
    			>
    

    js

    // 保存历史记录(获取本地数据)
    			hisArr:uni.getStorageSync('history')||[]
    

    点击回车以后,把我们的数据添加到数组中

    // 输入框点击回车确定
    		confirmSeach(){
    			// 保存搜索的数据
    			const str=this.word
    			// 判断数组中是否有相同的值
    			const data=this.hisArr.indexOf(str)
    			// 若索引不等于-1,则说明存在值
    			if(data!==-1){
    				// 删除数组中的值
    			this.hisArr.splice(data,1)
    			}
    			// 将当前点击的数组提前
    				this.hisArr.unshift(str)
    				// 将数组保存到本地
    				uni.setStorageSync('history',this.hisArr)
    			// 清空数据
    			this.word=''
    			// 清处联想建议
    			this.resultArr=[]
    		},
    

    此处我们使用了indexOf来进行判断,当然也可以使用其他的方法.
    在这里插入图片描述

    点击商品加入购物车

    数组方法:array.forEach+开关思想

    在商品列表点击的时候那,会进行token的验证,如果此时用户没有登录,我们会让用户进行登陆以后在进行购物车的添加.随后,又有一种新的突破方式,就是.用户没有登录,我们将添加的购物车数据保存到本地.等到用户登录的时候,我们在添加到购物车中.而我在项目中用到的就是这种方式
    在这里插入图片描述
    效果如下:
    在这里插入图片描述
    重复的数据我们使数量进行加加就可以了,不是重复的数据我们在添加到数组中
    定义的数据

     //uni.getStorageSync('item')获取本地的保存的商品记录
                carList:uni.getStorageSync('item')||[]
    
     // 点击加入购物车
            addItem(){
               // 将数据保存到购物车中
                // 保存到本地中
                // 定义一个对象保存数据
                const obj={
                    // 商品的id
                    goods_id:this.imgMsg.goods_id,
                    // 商品的名字
                    goods_name:this.imgMsg.goods_name,
                    // 商品的价格
                    goods_price:this.imgMsg.goods_price,
                    // 商品的数量
                    goods_number:1,
                    // 商品的图片
                    goods_small_logo:this.imgMsg.goods_small_logo
                }
                // 判断商品是否重复
                var status= false
                    //    遍历数组
                this.carList.forEach((item,index)=>{
                    //    如此时传入的对象id与数组中的对象id相同则说明存在某值
                    if(item.goods_id===obj.goods_id){
                        // 商品数量++
                    item.goods_number++
                        // 修改状态
                        status=true
                    return
    
                }
                })
                    // 如果status不等于true
                    if(status===false){
                        // 此时说明数据不重复
                        this.carList.push(obj)
                    }
                    // 消息提示添加购物车成功
                 uni.showToast({title:"添加购物车成功"})
                // 将数据保存到本地
                 uni.setStorageSync("item",this.carList);
            },
    

    此处我们定义可一个变量status来判断遍历的情况,当然也可以使用其他方法

    array.find()

     const data = this.carList.find(item => {
                  return item.goods_id === obj.goods_id
                })
                // ,有值则为true
                if(data){
                   data.goods_number++
                }
                // 如果没有值则返回的是undefined
                else{
                  this.carList.push(obj)
                }
    

    添加商品列表的数据

    使用方法:Array.concat()或Array.push(…Arr)

    //获取数据后将获取的数据
     // 保存到数组中
          this.textArr.push(...message.goods)
          //message.good是一个数组
          //第二种方法使用concat
          this.textArr=this.textArr.concat(message.goods)
    

    购物车实现单选

    一般情况下,当用户选中了某个商品加入购物车的时候,我们就认为用户会有买的想法,所以此时我们可以自定义一个加入购物车的状态。当我们添加商品进入购物车的时候,我们就认为这个状态是一个true。
    商品页的js

     // 定义一个对象保存数据
                const obj={
                    // 商品的id
                    goods_id:this.imgMsg.goods_id,
                    // 商品的名字
                    goods_name:this.imgMsg.goods_name,
                    // 商品的价格
                    goods_price:this.imgMsg.goods_price,
                    // 商品的数量
                    goods_number:1,
                    // 商品的图片
                    goods_small_logo:this.imgMsg.goods_small_logo,
                    //添加商品,默认选中
                    goods_status:true
                }
    

    此时我们进入js的时候我们加入的商品状态就应该是这个样子
    在这里插入图片描述
    默认的选中状态,在点击了以后发生状态的改变。
    接下来我们可以使用计算属性来确定全选的状态,可以根据各个状态的个数来进行判断
    此时我们可以使用arr.filter()

    使用Array.filter()解决全选的问题

    购物车的js

     // 能否找到false
     //遍历商品的数组,判断data,如果data有值就说明有一个状态是没有选中的
            if(this.itemList){
              const data= this.itemList.find(i=>{
             return i.goods_status===false
            })
            // 找到就是有值
            if(data){
              // 保存数据
              //此时返回false状态就行
              return false
            }
            // 没有值就是undefined
            //没有值就说明都是true,都是选中的状态
            return true
            }
    

    此时我们就实现了点击单选后实现全选的状态
    在这里插入图片描述
    接下来就是实现点击全选和全不选的问题

    实现点击全选和取消全选

    使用方法array.forEach()

    思路实现,获取当前全选的状态,点击后设置为!status取反的状态,
    根据当前的状态对数组进行判断,使数组中的数据全部设置为当前全选的状态

    // 点击全选的切换
          changeAllCheck(){
            // 获取当前点击的状态
            const status=!this.allCheck
            // 点击全选的切换
            this.itemList.forEach(i=>{
              // 若当前点击的是true则所有的单选都需要是true
                if(status){
                  i.goods_status=true
                  // 若所有的都是false则都需要时false
                }
                else{
                  i.goods_status=false
                }
                // 保存本地数据
                uni.setStorageSync('item',this.itemList)
            })
          },
    

    在这里插入图片描述

    实现点击单选和全选的时候显示总价

    使用方法:array.forEach()

    对于总价,遍历数组的时候进行判断,若此时的状态是false,那么就跳过,如果是true那么就是总数相加

     // 计算总价
          addNum(){
                var result=0
                // 遍历数组
              if(this.itemList){
                  this.itemList.forEach(i=>{
                  // 如遍历到当前状态是false,直接return
                   if(i.goods_status===false){
                     return
                   }
                  //  状态为true直接进行计算,获取总价
                    result=result+(i.goods_price*i.goods_number )
    
                })
              }
            return result
            }
    

    有余力可以使用array.reduce进行尝试
    在这里插入图片描述

    确定加入商品的数量

    使用方法:array.filter()

    使用计算属性获取到计算的数量,ruo当前选中的状态是true则我们可以还是用filter返回一个数组,根据数组的长度来进行判断

     // 获取选中的个数
          checkNum(){
            // 获取选中的个数
            if(this.itemList){
              return this.itemList.filter(i=>{
             return i.goods_status===true
            })
           }
    
          },
    

    在这里插入图片描述

    点击数量进行增减

    将两个事件绑定在一个事件上面

     // 点击数量进行增减
          indecrease(id,index){
            // 若此时点击了减一
            if(id===-1){
              this.itemList[index].goods_number+=id
              if(this.itemList[index].goods_number<=1){
                this.itemList[index].goods_number=1
              }
            }
            if(id===1){
              this.itemList[index].goods_number+=id
              if(this.itemList[index].goods_number>=10){
                this.itemList[index].goods_number=10
              }
            }
            // 保存数据
            uni.setStorageSync('item',this.itemList)
          },
    

    此处传入两个参数,一个是1或者是-1,另一个是索引

    总结:

    数组的方法在是非常常用的,在平常的项目中可以自己总结哪些地方用到了这些方法,以及解决方法的思路.
    推荐参考:
    https://developer.mozilla.org/zh-CN/docs/Glossary/array
    项目地址:
    https://gitee.com/monhly/applets

    展开全文
  • 子程序 超级列表框_读取, 逻辑型, , 读取已保存的内容到超级列表框.参数 超级列表框, 超级列表框.参数 文件路径, 文本型.参数 分割符合, 文本型, 可空, 默认为----.参数 图片, 整数型, 可空.局部变量 文本, 文本型....

    2067c8132c05a74cf1fd89fe1df94b5e.png

    .子程序 超级列表框_读取, 逻辑型, , 读取已保存的内容到超级列表框

    .参数 超级列表框, 超级列表框

    .参数 文件路径, 文本型

    .参数 分割符合, 文本型, 可空, 默认为----

    .参数 图片, 整数型, 可空

    .局部变量 文本, 文本型

    .局部变量 x, 整数型

    .局部变量 数组, 文本型, , "0"

    .局部变量 y, 整数型

    .局部变量 项目, 文本型, , "0"

    .局部变量 a, 整数型

    .局部变量 分隔, 文本型

    分隔 = 选择 (是否为空 (分割符合), “----”, 分割符合)

    .如果真 (文件是否存在 (文件路径) = 假)

    返回 (0)

    .如果真结束

    文本 = 到文本 (读入文件 (文件路径))

    数组 = 分割文本 (文本, #换行符, )

    .变量循环首 (1, 取数组成员数 (数组), 1, x)

    项目 = 分割文本 (数组 [x], 分隔, )

    a = 超级列表框.插入表项 (, , 图片, , , )

    .计次循环首 (取数组成员数 (项目), y)

    超级列表框.置标题 (x - 1, y - 1, 项目 [y])

    .计次循环尾 ()

    .变量循环尾 ()

    返回 (x - 1)

    展开全文
  • generell,将成员紧密存储在一个数组中的每个类/结构,如下所示: 特征值: put(eigen_vactor3d.x(), "eigen_vector3d") glm: put(glm_vec3[0], "glm_vec3d") 您可以通过提供该类型的解析器来轻松添加对...
  • 项目中需要根据商品分类动态生成一个若干个复选框列表,接着,根据列表的内容排列组合生成一个二维数组,最后,需要将二维数组显示表格。这里,定义二维数组的格式如下图所示: 如图所示,字典数据skuList...
  • 我之前一个项目的时候,发现了一个奇怪的问题,像[{},{}…]这样子的对象数组居然没有办法做列表渲染循环出来,我打印了一下发现数组是有值的,只是给数组添加数组的时候用了数组的unshift方法,并没有使用小.....
  • 本课首先录制了易语言组合渐变背景颜色,然后通过读写配置文件ini来实现组合加入项目,添加项目列表 视频链接: 77 组合读取写配置文件和列表项目视频教程源码: .版本 2 .程序集 窗口程序集_启动窗口...
  •  加入成员 (选择数组, 选择列表框1.取项目文本 (i - 1))  信息框 (选择列表框1.取项目文本 (i - 1), 0, ) 计次循环尾 () 3.连接数据库 a.启动窗口上添加odbC源(拖入就可以了) b.外部...
  • 数组是为了解决同类数据整合摆放而提出的,可以理解为组具有相同类型的变量的集合,它的每元素都具有相同的数据类型。 2.数组的声明 1.<data_type>[] <array_name>; 2.<data_type> <array...
  • vb列表框ListBox的详细使用方法

    万次阅读 2018-06-12 15:19:45
    列表框(ListBox)控件表示一个选项清单,用户可能用鼠标选择其中一个或者几个选项。 列表框的特点是:列表框中项目是通过程序插入到其中的,用户无法向清单输入数据,当选择其中的项
  • 如何 Unity 制作一个道具系统

    万次阅读 2018-05-25 17:25:18
    原文:How to make a Power-Up System in Unity 作者:Kevin Small ...道具系统是一个关键的游戏组件,因为它们增加了额外的复杂性和策略层,来保持移动的动作。 本教程你将学会: 设计、...
  • 解决vue项目中页面调用数据 数据加载完毕之前出现undefined问题在项目中遇到后台数据还没有加载完毕,但是页面上调用了后台数据的字段,这样就会报undefined。例如:进入页面直接回显数据。我created里面...
  • 黑马程序员课程Vue实战项目_Element-ui——电商后台管理系统-商品管理(商品列表
  • vb学习总结, 列表框  1、属性  1、columns  该属性用来确定列表的列数。当该属性设置为0(默认)是,所用的项目呈单列显示。...list属性保存列表框中所有值得数组,可以通过下标访问数组中的值(下标值从
  • OpenCV实践项目之信用卡数字识别
  • 基于vue v-for 循环复选-默认勾选第一个的实现方法应用场景:进行多选的时候一般默认显示第一个。实现方法:纯vue实现例子:{{one.name}}//:checked="index == 0"为索引为0的,即为第一个复选添加属性。拓展:...
  • 有状态SessionBean,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存清除…… Java Socket 聊天...
  • TL; DR:set()函数使用Pythons迭代协议创建...要理解为什么迭代NumPy数组的速度太慢,了解Python对象,Python列表和NumPy数组如何存储内存非常重要.Python对象需要一些簿记属性(如引用计数,其类的链接,……)及其表...
  • Javascript引用类型之时间Date  JavaScript的Date类型是早期Java的java.util.Date类基础上构建的。...当没有向构造函数传递日期参数时,将创建一个拥有当前日期和时间的对象。 当然,如果想根据特定的日期和
  • 这两天做公司的一个项目时,制作了一个不错的小功能,使用的框架是elementUI,通过checkbox勾选需要的模块,动态添加模块一个功能效果。虽然难度不大,但还是踩了一些坑,这记录并给需要此功能的开发者一些...
  • 《利用 Python 进行数据分析 · 第 2 版》第 4 章 NumPy 基础:数组和矢量计算第 1 章 准备工作第 2 章 Python 语法基础,IPython 和 Jupyter第 3 章 Python 的数据结构、函数和文件第 4 章 NumPy 基础:数组和矢量...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
    有状态SessionBean,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存清除…… Java Socket 聊天...
  • 目录 题 码 TextBox控件和ListBox控件 ListBox控件的ListFiIIRange属性和List...如图所示,该表为某公司客户一览,现准备建立查询表,希望查询表的客户列建立下拉列表,并允许输入关键字后显示匹配该关键字..
  • 在项目的实际开发,经常需要设计各种各样表单。直接编写HTML表单虽然简单,但修改、维护相对麻烦。 因此,可以利用PHP实现一个Web表单生成器,使其可以根据具体的需求定制不同功能的表单。具体实现需求如下: ...
  • Vue项目开发,遇到的各种痛点问题和解决方案

    千次阅读 多人点赞 2021-02-20 00:36:06
    Vue项目开发,遇到的各种痛点问题和解决方案
  • 因为以前你不学英语是有很大障碍的,碰到一个英文函数名就得放弃源代码的理解先去查找这个函数名的意思。如果记忆这个函数名,那么函数名总数是一个非常大的数字,对英文的不熟悉也导致了记忆一个函数名就像记忆一...
  • 如何取得list最后一个元素使用PYTHON最简单了arr = [1,2,3,4]直接使用arr[-1]就可以得到list最后一个元素怎样获取list集合的最后一个对象的值指令:list.get(list.size()-1);C语言List的含义:链表是一种...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 62,739
精华内容 25,095
关键字:

列表框中的项目保存在一个数组中