(九) 盘古UI,日期和时间选择控件,自定义多种场景!

(九) 盘古UI,日期和时间选择控件,自定义多种场景!

盘古UI,较为全面的自定义UI框架,帮助你绝对的快速开发!(长期维护中)

控件位置:
主要控件: com.smart.pangu_ui_lib.widget.PanguSelectDateView
内部使用的时间弹窗:pop: com.smart.pangu_ui_lib.pop.PopSelectDate

demo地址,点击查看github

时间和日期选择器

时间日期选择器可以灵活设置选择模式,是年月日还是其他的模式,包含多种模式可选,可以支持双时间展示等,更多功能见demo!

1, 样例展示图

请添加图片描述

2, 使用说明

1,布局
  <com.smart.pangu_ui_lib.widget.PanguSelectDateViewandroid:id="@+id/pg_date"android:layout_margin="18dp"app:pgsdate_hint_start="开始时间"app:pgsdate_hint_end="结束时间"app:pgsdate_must="true"app:pgsdate_select_mode="yyyy_MM_dd_HH_mm_ss"android:layout_width="match_parent"android:layout_height="wrap_content"app:pgsdate_title="选择出发时间" />
2,方法使用
 mPgDate.setOnDateSureListener(new PanguSelectDateView.OnDateSureListener() {@Overridepublic boolean onSureClick(int type, PanguSelectView view, String currentSelectDate, long currentSelectDateMillis) {showToast("选中的时间 , "+currentSelectDate);//上次选择的时间long startTime = mPgDate.getStartTimeMillis();long endTime = mPgDate.getEndTimeMillis();if (type==0){//开始时间if (currentSelectDateMillis>System.currentTimeMillis()){showToast("请选择当前时间-之前-的时间 ");return true;}}if (type==1){//结束时间if (currentSelectDateMillis<System.currentTimeMillis()){showToast("请选择当前时间-之后-的时间 ");return true;}}return false;}});

3, 方法和属性说明

attr属性方法 method介绍 introduction
pgsdate_select_modesetDateSelectMode(int mode)日期选择形式 0,年; 1,年月日; 2,年月日时分;3,月日;4,时分;5年月日时分秒
pgsdate_show_modesetDateShowMode(int mode)日期显示形式 1,显示一个日期 ; 2,显示两个日期
pgsdate_titlesetTitle(String title)名称
pgsdate_hint_startsetHintStart(String hintStart)开始时间的提示
pgsdate_hint_endsetHintEnd(String hintEnd)结束时间的提示
pgsdate_enablesetEnable(boolean enable)是否可用
pgsdate_mustsetIsMust(boolean must)必选
pgsdate_bordersetBorder(boolean border)边框
pgsdate_title_colorsetTitleColor(int titleColor)标题颜色
pgsdate_show_titlesetTitleVisibility(int visibility)是否显示标题
----setSize(int width, int height)设置布局宽高
----int getDateSelectMode()日期选择形式
----String getDateTransFormat()获取时间转换格式
----setData(String name, String keyStart, String keyEnd)设置搜索条件名称和输入提示
----setStartTime(String t)设置开始时间
----setEndTime(String t)设置结束时间
----String getYear()获取年
----String getStartTime()获取开始时间
----String getEndTime()获取结束时间
----long getStartTimeMillis()获取开始时间
----long getEndTimeMillis()获取结束时间
----reset()重置

4, 代码和方法简析

1,PopSelectDate,时间的弹窗

/*** 本类的主要功能是 :  wheelView的使用** @author jiang_zheng_yan  2020/4/7 17:27*/
public class PopSelectDate extends PanguBasePop {private static final String TAG = "PopWheelViewDemo";private LinearLayout mLlContainer;private WheelView mWvHour;private WheelView mWvMin;private TextView mTvYear;private TextView mTvMonth;private TextView mTvDay;private TextView mTvHour;private TextView mTvMin;private TextView mTvSecond;private TextView mTvCancel;private TextView mTvSure;private LinearLayout mLlPopRoot;private WheelView mWvYear;private WheelView mWvMonth;private WheelView mWvDay;private WheelView mWvSecond;private int year;private int month;private int day;private int hour;private int min;private int second;private static int startyear = 1900;private static int endyear = 2100;private int date_select_mode = 2;//0,年; 1,年月日; 2,年月日时分public PopSelectDate(Context context) {super(context);}@Overrideprotected int getContentViewId() {return R.layout.pop_select_date;}@Overridepublic void initData(View v, Context context) {mLlContainer = v.findViewById(R.id.ll_container);mWvHour = v.findViewById(R.id.wv_hour);mWvMin = v.findViewById(R.id.wv_min);mTvYear = v.findViewById(R.id.tv_year);mTvMonth = v.findViewById(R.id.tv_month);mTvDay = v.findViewById(R.id.tv_day);mTvHour = v.findViewById(R.id.tv_hour);mTvMin = v.findViewById(R.id.tv_min);mTvSecond = v.findViewById(R.id.tv_second);mTvCancel = v.findViewById(R.id.tv_cancel);mTvSure = v.findViewById(R.id.tv_sure);mLlPopRoot = v.findViewById(R.id.ll_pop_root);mWvYear = v.findViewById(R.id.wv_year);mWvMonth = v.findViewById(R.id.wv_month);mWvDay = v.findViewById(R.id.wv_day);mWvSecond = v.findViewById(R.id.wv_second);Calendar calendar = Calendar.getInstance();year = calendar.get(Calendar.YEAR);month = calendar.get(Calendar.MONTH) + 1;day = calendar.get(Calendar.DAY_OF_MONTH);hour = calendar.get(Calendar.HOUR_OF_DAY);min = calendar.get(Calendar.MINUTE);second = calendar.get(Calendar.SECOND);initListener();//动画setAnimaType(AnimaType.BOTTOM_IN_OUT);//设置日期数据setDateData();}private void initListener() {mTvSure.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {dismiss();if (onClickSureListener != null) {onClickSureListener.onClick(view);}Log.e(TAG, "onViewClicked: " + getSelectDate("yyyy*MM*dd"));}});mTvCancel.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {dismiss();if (onClickCancelListener != null) {onClickCancelListener.onClick(view);}}});}private void setDateData() {//年ArrayList<WheelData> years = new ArrayList<>();//月ArrayList<String> months = new ArrayList<>();//时ArrayList<String> hours = new ArrayList<>();//分ArrayList<String> mins = new ArrayList<>();//秒ArrayList<String> seconds = new ArrayList<>();for (int i = startyear; i <= endyear; i++) {WheelData wheelData = new WheelData();wheelData.setAge(i);wheelData.setName(i + "");years.add(wheelData);}for (int i = 1; i <= 12; i++) {months.add((i + "").length() == 1 ? "0" + i : i + "");}for (int i = 0; i < 24; i++) {hours.add((i + "").length() == 1 ? "0" + i : i + "");}for (int i = 0; i < 60; i++) {mins.add((i + "").length() == 1 ? "0" + i : i + "");}for (int i = 0; i < 60; i++) {seconds.add((i + "").length() == 1 ? "0" + i : i + "");}//年mWvYear.setAdapter(new BaseWheelAdapter<WheelData>(years));mWvYear.setCurrentItem(year - startyear);mWvYear.setCyclic(false);mWvYear.setOnItemSelectedListener(new OnItemSelectedListener() {@Overridepublic void onItemSelected(int index, Object item) {year = Integer.parseInt(((WheelData) item).getPickerViewText());mWvDay.setAdapter(new BaseWheelAdapter<String>(DateUtil.getDaysList(year, month)));}});//月mWvMonth.setAdapter(new BaseWheelAdapter<String>(months));mWvMonth.setCurrentItem(month - 1);mWvMonth.setCyclic(false);mWvMonth.setOnItemSelectedListener(new OnItemSelectedListener() {@Overridepublic void onItemSelected(int index, Object item) {month = index + 1;int preItemIndex = mWvDay.getCurrentItemIndex();ArrayList<String> daysList = DateUtil.getDaysList(year, month);if (preItemIndex + 1 > daysList.size()) {preItemIndex = daysList.size() - 1;}mWvDay.setAdapter(new BaseWheelAdapter<String>(daysList));//修复问题mWvDay.setCurrentItem(preItemIndex);}});//日mWvDay.setAdapter(new BaseWheelAdapter<String>(DateUtil.getDaysList(year, month)));mWvDay.setCurrentItem(day - 1);mWvDay.setCyclic(false);mWvDay.cancelFuture();//小时mWvHour.setAdapter(new BaseWheelAdapter<String>(hours));mWvHour.setCurrentItem(hour);mWvHour.setCyclic(false);mWvHour.cancelFuture();//分mWvMin.setAdapter(new BaseWheelAdapter<String>(mins));mWvMin.setCurrentItem(min);mWvMin.setCyclic(false);mWvMin.cancelFuture();//秒mWvSecond.setAdapter(new BaseWheelAdapter<String>(seconds));mWvSecond.setCurrentItem(second);mWvSecond.setCyclic(false);mWvSecond.cancelFuture();}/*** 获取选择的日期时间** @return*/public String getSelectDate(String format) {String originFormat = "yyyy-MM-dd HH:mm";
//     0,年; 1,年月日; 2,年月日时分 3,月日 4,时分 5,年月日时分秒String dateStr = year + "-" + month + "-" + mWvDay.getCurrentItem() + " " + mWvHour.getCurrentItem() + ":" + mWvMin.getCurrentItem() + ":" + mWvSecond.getCurrentItem();switch (date_select_mode) {case 0:dateStr = year + "";originFormat = "yyyy";break;case 1:dateStr = year + "-" + month + "-" + mWvDay.getCurrentItem();originFormat = "yyyy-MM-dd";break;case 2:dateStr = year + "-" + month + "-" + mWvDay.getCurrentItem() + " " + mWvHour.getCurrentItem() + ":" + mWvMin.getCurrentItem();originFormat = "yyyy-MM-dd HH:mm";break;case 3:dateStr = month + "-" + mWvDay.getCurrentItem();originFormat = "MM-dd";break;case 4:dateStr = mWvHour.getCurrentItem() + ":" + mWvMin.getCurrentItem();originFormat = "HH:mm";break;case 5:dateStr = year + "-" + month + "-" + mWvDay.getCurrentItem() + " " + mWvHour.getCurrentItem() + ":" + mWvMin.getCurrentItem() + ":" + mWvSecond.getCurrentItem();originFormat = "yyyy-MM-dd HH:mm:ss";break;}return DateUtil.translateDateStr(dateStr, originFormat, format);}/*** 日期选择形式** @param mode 0,年; 1,年月日; 2,年月日时分 3,月日 4,时分 5,年月日时分秒*/public void setDateSelectMode(int mode) {date_select_mode = mode;//显示年//显示月//显示日//显示时//显示分boolean showYear = mode == 0 || mode == 1 || mode == 2 || mode == 5;boolean showMonth = mode == 1 || mode == 2 || mode == 3 || mode == 5;boolean showDay = mode == 1 || mode == 2 || mode == 3 || mode == 5;boolean showHour = mode == 2 || mode == 4 || mode == 5;boolean showMin = mode == 2 || mode == 4 || mode == 5;boolean showSecond = mode == 5;mTvYear.setVisibility(showYear ? View.VISIBLE : View.GONE);mTvMonth.setVisibility(showMonth ? View.VISIBLE : View.GONE);mTvDay.setVisibility(showDay ? View.VISIBLE : View.GONE);mTvHour.setVisibility(showHour ? View.VISIBLE : View.GONE);mTvMin.setVisibility(showMin ? View.VISIBLE : View.GONE);mTvSecond.setVisibility(showSecond ? View.VISIBLE : View.GONE);mWvYear.setVisibility(showYear ? View.VISIBLE : View.GONE);mWvMonth.setVisibility(showMonth ? View.VISIBLE : View.GONE);mWvDay.setVisibility(showDay ? View.VISIBLE : View.GONE);mWvHour.setVisibility(showHour ? View.VISIBLE : View.GONE);mWvMin.setVisibility(showMin ? View.VISIBLE : View.GONE);mWvSecond.setVisibility(showSecond ? View.VISIBLE : View.GONE);}/*** 是否循环** @param isCylic*/public void setIsCylic(boolean isCylic) {mWvYear.setCyclic(isCylic);mWvMonth.setCyclic(isCylic);mWvDay.setCyclic(isCylic);mWvHour.setCyclic(isCylic);mWvMin.setCyclic(isCylic);}/*** 设置当前选中的日期** @param dateStr 日期* @param format  格式 yyyy-MM-dd HH:mm:ss*/public void setCurrentDate(String dateStr, String format) {if (TextUtils.isEmpty(format)) {return;}try {long dateTimeMillis = DateUtil.getDateTimeMillis(dateStr, format);Calendar calendar = Calendar.getInstance();calendar.setTime(dateTimeMillis == 0 ? new Date() : new Date(dateTimeMillis));year = calendar.get(Calendar.YEAR);month = calendar.get(Calendar.MONTH) + 1;day = calendar.get(Calendar.DAY_OF_MONTH);hour = calendar.get(Calendar.HOUR_OF_DAY);min = calendar.get(Calendar.MINUTE);second = calendar.get(Calendar.SECOND);setDateData();} catch (Exception e) {Log.e(TAG, "setCurrentDate: 设置当前日期异常");}}// 设置wheelview 的数据实体(除 string int)需要实现 IPickerViewDatastatic class WheelData implements PickerViewData {private String name;private int age;@Overridepublic String getPickerViewText() {return name;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}
}
2,PanguSelectDateView,时间控件,内部时间弹窗使用的是PopSelectDate

/*** 本类的主要功能是 :时间控件** @author jiangzhengyan  2024/4/19 15:00*/
public class PanguSelectDateView extends BaseView {private LinearLayout mRoot;private PanguSelectView mCsvStartDate;private ImageView mIvArrow;private PanguSelectView mCsvEndDate;private String keyStart;private String keyEnd;private int csdate_select_mode;private int csdate_show_mode;private String title;private String hintStart;private String hintEnd;private boolean enable;private boolean must;private int showTitle;public PanguSelectDateView(Context context) {super(context);}public PanguSelectDateView(Context context, AttributeSet attrs) {super(context, attrs);}@Overrideprotected int getLayoutId() {return R.layout.pangu_select_date_view;}@Overrideprotected void initView(Context context, AttributeSet attrs, int defStyleAttr) {mRoot = findViewById(R.id.root);mCsvStartDate = findViewById(R.id.csv_start_date);mIvArrow = findViewById(R.id.iv_arrow);mCsvEndDate = findViewById(R.id.csv_end_date);TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.PanguSelectDateView, defStyleAttr, 0);//名称title = typedArray.getString(R.styleable.PanguSelectDateView_pgsdate_title);//开始时间的提示hintStart = typedArray.getString(R.styleable.PanguSelectDateView_pgsdate_hint_start);//结束时间的提示hintEnd = typedArray.getString(R.styleable.PanguSelectDateView_pgsdate_hint_end);//是否可用enable = typedArray.getBoolean(R.styleable.PanguSelectDateView_pgsdate_enable, true);//必选must = typedArray.getBoolean(R.styleable.PanguSelectDateView_pgsdate_must, false);//显示日期样式//0,年; 1,年月日; 2,年月日时分;3,月日;4,时分;5年月日时分秒csdate_select_mode = typedArray.getInt(R.styleable.PanguSelectDateView_pgsdate_select_mode, 1);//1,显示一个日期 ; 2,显示两个日期csdate_show_mode = typedArray.getInt(R.styleable.PanguSelectDateView_pgsdate_show_mode, 2);//是否显示标题showTitle = typedArray.getInt(R.styleable.PanguSelectDateView_pgsdate_show_title, 0);typedArray.recycle();init();}public void init() {FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);this.setLayoutParams(params);mCsvStartDate.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {showTimePicker(0, csdate_select_mode);}});mCsvEndDate.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {showTimePicker(1, csdate_select_mode);}});setDateShowMode(csdate_show_mode);setDateSelectMode(csdate_select_mode);setIsMust(must);setHintStart(hintStart);setHintEnd(hintEnd);setTitle(title);setEnable(enable);setTitleVisibility(showTitle);}/*** 设置布局宽高** @param width* @param height*/public void setSize(int width, int height) {ViewGroup.LayoutParams layoutParams = mRoot.getLayoutParams();layoutParams.width = width;layoutParams.height = height;mRoot.setLayoutParams(layoutParams);}public void setIsMust(boolean must) {this.must = must;mCsvStartDate.setIsMust(must);}private void setHintEnd(String hintEnd) {mCsvEndDate.setHint(hintEnd);}public void setHintStart(String hintStart) {mCsvStartDate.setHint(hintStart);}/*** 是否显示标题** @param visibility {@link View#VISIBLE}   {@link View#INVISIBLE}   {@link View#GONE}*/public void setTitleVisibility(int visibility) {if (mCsvStartDate != null) {mCsvStartDate.setTitleVisibility(visibility);}if (mCsvEndDate != null) {mCsvEndDate.setTitleVisibility(visibility);}}/*** 日期显示形式** @param mode 1,显示一个日期 ; 2,显示两个日期*/public void setDateShowMode(int mode) {this.csdate_show_mode = mode;mIvArrow.setVisibility(mode == 1 ? GONE : VISIBLE);mCsvEndDate.setVisibility(mode == 1 ? GONE : VISIBLE);}/*** 日期选择形式** @param mode 0,年; 1,年月日; 2,年月日时分;3,月日;4,时分;5年月日时分秒*/public void setDateSelectMode(int mode) {csdate_select_mode = mode;switch (csdate_select_mode) {case 0:transFormat = "yyyy";break;case 1:transFormat = "yyyy-MM-dd";break;case 2:transFormat = "yyyy-MM-dd HH:mm";break;case 3:transFormat = "MM-dd";break;case 4:transFormat = "HH:mm";break;case 5:transFormat = "yyyy-MM-dd HH:mm:ss";break;}}/*** 日期选择形式** @return {@link #setDateSelectMode(int)}*/public int getDateSelectMode() {return csdate_select_mode;}/*** 获取时间转换格式** @return 时间转换格式 {@link #setDateSelectMode(int)}*/public String getDateTransFormat() {return transFormat;}//设置搜索条件名称和输入提示public void setData(String name, String keyStart, String keyEnd) {mCsvStartDate.setTitle(name);mCsvStartDate.setSelectText("", keyStart);mCsvEndDate.setSelectText("", keyEnd);this.keyStart = keyStart;this.keyEnd = keyEnd;}private String transFormat = "yyyy-MM-dd";/*** 显示时间选择** @param type 0,开始时间; 1,结束时间*/private void showTimePicker(int type, int csdate_select_mode) {PopSelectDate timePicker = new PopSelectDate(getContext());timePicker.setDateSelectMode(csdate_select_mode);//回显时间滚轮时间timePicker.setCurrentDate(type == 0 ? getStartTime() : getEndTime(), transFormat);timePicker.setOnClickSureListener(view -> {String selctTime = timePicker.getSelectDate(transFormat);if (onDateSureListener != null) {//true的话代表自己处理long dateTimeMillis = DateUtil.getDateTimeMillis(selctTime, transFormat);boolean sureClick = onDateSureListener.onSureClick(type, type == 0 ? mCsvStartDate : mCsvEndDate, selctTime, dateTimeMillis);if (sureClick) {return;}}if (type == 0) {// 开始时间setStartTime(selctTime);} else {// 结束时间setEndTime(selctTime);}//timePicker.dismiss();});timePicker.showAtCenter();}/*** 设置开始时间** @param t*/public void setStartTime(String t) {if (mCsvStartDate != null)mCsvStartDate.setSelectText("", t);}/*** 设置结束时间** @param t*/public void setEndTime(String t) {if (mCsvEndDate != null)mCsvEndDate.setSelectText("", t);}/*** @return*/public String getYear() {if (csdate_select_mode == 0 || csdate_select_mode == 1 || csdate_select_mode == 2 || csdate_select_mode == 5) {String startTime = getStartTime();if (!TextUtils.isEmpty(startTime)) {return startTime.substring(0, 4);}}return "";}/*** 获取开始时间** @return*/public String getStartTime() {String start = mCsvStartDate.getValue();if (TextUtils.isEmpty(start)) {start = "";}return start;}/*** 获取结束时间** @return*/public String getEndTime() {String end = mCsvEndDate.getValue();if (TextUtils.isEmpty(end)) {end = "";}return end;}/*** 获取开始时间** @return*/public long getStartTimeMillis() {String start = mCsvStartDate.getValue();if (TextUtils.isEmpty(start)) {start = "";}String originFormat = "";switch (csdate_select_mode) {case 0:originFormat = "yyyy";break;case 1:originFormat = "yyyy-MM-dd";break;case 2:originFormat = "yyyy-MM-dd HH:mm";break;case 3:originFormat = "MM-dd";break;case 4:originFormat = "HH:mm";break;case 5:originFormat = "yyyy-MM-dd HH:mm:ss";break;}return DateUtil.getDateTimeMillis(start, originFormat);}/*** 获取结束时间** @return*/public long getEndTimeMillis() {String end = mCsvEndDate.getValue();if (TextUtils.isEmpty(end)) {end = "";}String originFormat = "";switch (csdate_select_mode) {case 0:originFormat = "yyyy";break;case 1:originFormat = "yyyy-MM-dd";break;case 2:originFormat = "yyyy-MM-dd HH:mm";break;case 3:originFormat = "MM-dd";break;case 4:originFormat = "HH:mm";break;case 5:originFormat = "yyyy-MM-dd HH:mm:ss";break;}return DateUtil.getDateTimeMillis(end, originFormat);}/*** 重置*/public void reset() {mCsvStartDate.setSelectText("", "");mCsvEndDate.setSelectText("", "");}public void setTitle(String title) {if (mCsvStartDate != null) {mCsvStartDate.setTitle(title);}}public void setEnable(boolean enable) {this.enable = enable;mCsvStartDate.setEnable(enable);mCsvEndDate.setEnable(enable);}private OnDateSureListener onDateSureListener;//确定public void setOnDateSureListener(OnDateSureListener onDateSureListener) {this.onDateSureListener = onDateSureListener;}//日期选中点击确定public interface OnDateSureListener {/*** 确定** @param type                    0,开始时间; 1,结束时间* @param view                    选择控件* @param currentSelectDate       当前选择的日期* @param currentSelectDateMillis 当前选择的日期时间戳* @return*/boolean onSureClick(int type, PanguSelectView view, String currentSelectDate, long currentSelectDateMillis);}
}

5, 获取地址

demo地址,点击查看github
欢迎您扫码安装体验demo
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/1616.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nginx反向代理.NetCore开发的基于WebApi创建的gRPC服务

一、本文中使用的工具: Vs2022使用.NET 8.0开发基于ASP.NET Core WebApi的gRPC服务; Nginx:1.25.5,下载地址:http://nginx.org/en/download.html 二、gRPC介绍: 由 google 开发,是一款语言中立、平台中立、开源的远程过程调用(RPC)系统。在vs2022中可以直接创建gRP…

设计模式之模板方法模式详解(下)

3&#xff09;钩子方法的使用 1.概述 钩子方法的引入使得子类可以控制父类的行为。 2.结构图 3.代码实现 将公共方法和框架代码放在抽象父类中 abstract class DataViewer {//抽象方法&#xff1a;获取数据public abstract void GetData();//具体方法&#xff1a;转换数据…

【JAVA面试题】探索多线程同步:ReentrantLock与synchronized的对比解析

程序员如何搞副业&#xff1f; 文章目录 程序员如何搞副业&#xff1f;强烈推荐引言&#xff1a;ReentrantLock介绍可重入性&#xff08;Reentrancy&#xff09;&#xff1a;公平性&#xff08;Fairness&#xff09;&#xff1a;条件变量&#xff08;Condition&#xff09;&…

C语言基础(入门综合案例)

学生信息管理系统 学员管理系统可以实现对学员的添加、全部显示、查询、修改、删除功能 数据存储格式说明 // 宏定义的常量&#xff0c;代表学生的最大个数 #define NUM 100// 结构体类型 struct stu 别名为 STU typedef struct stu {char name[30]; // 姓名int age; …

海外代理IP|Facebook对IP都有哪些要求?要选哪种?

众所周知&#xff0c;Facebook封号大多数情况都是因为IP的原因。Facebook对于用户账号有严格的IP要求和限制&#xff0c;以维护平台的稳定性和安全性。在这种背景下&#xff0c;海外IP代理成为了一种有效的解决方案&#xff0c;帮助用户避免检测&#xff0c;更加快捷安全地进行…

影响钕铁硼磁钢性能的因素及方法

钕铁硼永磁材料自问世以来&#xff0c;就以其优越的磁性能而备受关注&#xff0c;被称为“磁王“&#xff0c;在市场需求的不断地增长下&#xff0c;钕铁硼生产工艺及磁体性能也不断发展和提升。我们一般用剩磁、矫顽力和最大磁能积这几个指标来衡量磁性材料的磁性能。 剩磁 B…

C语言数据结构之链表

目录 前言 \color{maroon}{前言} 前言1.链表的概念及结构2.链表的分类3.无头单向非循环链表的实现4.带头双向循环链表的实现5.顺序表和链表的对比 前言 \color{maroon}{前言} 前言 在上一篇博客中我们提到&#xff0c;线性表包括顺序表和链表&#xff0c;顺序表在上篇博客中已…

力扣HOT100 - 25. K 个一组翻转链表

解题思路&#xff1a; class Solution {public ListNode reverseKGroup(ListNode head, int k) {ListNode dum new ListNode(0, head);ListNode pre dum;ListNode end dum;while (end.next ! null) {for (int i 0; i < k && end ! null; i) {end end.next;}if …

学习笔记-数据结构-线性表(2024-04-17)

设计一个算法实现在单链表中删除值相同的多余节点的算法。 设计思想&#xff1a;双指针 变量说明&#xff1a; head - 参数变量&#xff0c;代表链表的头节点。在调用DelSameNum函数时&#xff0c;需要传递链表的头节点的地址给这个参数&#xff0c;从而允许函数对链表进行操作…

类和对象(中)(构造函数、析构函数和拷贝构造函数)

1.类的六个默认成员函数 任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 //空类 class Date{}; 默认成员函数&#xff1a;用户没有显示实现&#xff0c;编译器会自动生成的成员函数称为默认成员函数 2.构造函数 构造函数 是一个 特殊的成员函数&a…

docker容器技术篇:centos7搭建docker swarm集群

centos7搭建docker swarm集群 一 docker swarm 概述 1.1 swarm简介 Docker Swarm是 Docker 的集群管理工具&#xff0c;Swarm 在 Docker 1.12 版本之前属于一个独立的项目&#xff1b;其主要作用是把Docker集群抽象为一个整体&#xff0c;并且通过一个统一管理这些 Docker 主…

密码学 | 数字证书:应用

&#x1f951;原文&#xff1a;数字签名和数字证书的原理解读 - 知乎 &#x1f951;前文&#xff1a;密码学 | 数字签名 数字证书 - CSDN &#x1f951;提示&#xff1a;把客户端想成 Alice&#xff0c;服务器端想成 Bob 即可。客户端实际上指的是客户端浏览器。 下面&#…

前端入门:HTML(CSS边框综合案例)

案例&#xff1a; 源代码&#xff1a; css-borders.html: <body> <div id"square"> </div> <br> <div id"triangle"> </div> <br> <div id"trapezium"> </div> <br> <div id…

【C语言】指针篇-深入探索数组名和指针数组(2/5)- 必读指南

&#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;C笔记专栏&#xff1a; C笔记 &#x1f308;喜欢的诗句:无人扶我青云志 我自踏雪至山巅 文章目录 认识指针与数组之间的关系(涉及二级指针)**数组名****指针访问…

面试后,公司如何决定你的去留

在现代职场中&#xff0c;求职者在经历了一系列严格的面试流程后&#xff0c;往往会进入一段等待期。在这段时间里&#xff0c;他们满怀希望地等待企业的最终反馈。但有一个现象普遍存在&#xff1a;无论面试过程如何&#xff0c;最终决定权总是掌握在公司手中&#xff0c;由公…

企业常用Linux三剑客awk及案例/awk底层剖析/淘宝网cdn缓存对象分级存储策略案例/磁盘知识/awk统计与计算-7055字

高薪思维&#xff1a; 不愿意做的事情:加班&#xff0c;先例自己在利他 生活中先利他人在利自己 感恩&#xff0c;假设别人帮助过你&#xff0c;先帮助别人&#xff0c;感恩境界 awk三剑客老大 find其实也算是一种新的第四剑客 find 查找文件 查找文件&#xff0c;与其他命令…

推荐实用网站——算法可视化

网站链接 https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

variant

class RTTR_API variant 对github项目rttr&#xff08;C反射库&#xff09;解析&#xff0c;链接&#xff1a;https://github.com/rttrorg/rttr namespace rttr { class variant_associative_view; class variant_sequential_view; class type; class variant; class argumen…

真实世界的密码学(四)

原文&#xff1a;annas-archive.org/md5/655c944001312f47533514408a1a919a 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第十六章&#xff1a;加密何时何地失败 本章涵盖 使用加密时可能遇到的一般问题 遵循烘烤良好的加密的要点 加密从业者的危险和责任 问候…

论文笔记:Time-LLM: Time Series Forecasting by Reprogramming Large Language Models

iclr 2024 reviewer 评分 3888 1 方法 提出了 Time-LLM&#xff0c; 是一个通用的大模型重编程&#xff08;LLM Reprogramming&#xff09;框架将 LLM 轻松用于一般时间序列预测&#xff0c;而无需对大语言模型本身做任何训练 为什么需要时序数据和文本数据对齐&#xff1a;时…