本视频是解读性视频,所以希望您已经看过了本知识点的内容,并且编写了相应的代码之后,带着疑问来观看,这样收获才多。 不建议一开始就观看视频
3分48秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器 步骤 1 : 不支持泛型的Stack 步骤 2 : 支持泛型的Stack 步骤 3 : 练习-支持泛型的二叉树 步骤 4 : 答案-支持泛型的二叉树 package generic;
import java.util.LinkedList;
import charactor.Hero;
public class HeroStack {
LinkedList<Hero> heros = new LinkedList<Hero>();
public void push(Hero h) {
heros.addLast(h);
}
public Hero pull() {
return heros.removeLast();
}
public Hero peek() {
return heros.getLast();
}
public static void main(String[] args) {
HeroStack heroStack = new HeroStack();
for (int i = 0; i < 5; i++) {
Hero h = new Hero("hero name " + i);
System.out.println("压入 hero:" + h);
heroStack.push(h);
}
for (int i = 0; i < 5; i++) {
Hero h =heroStack.pull();
System.out.println("弹出 hero" + h);
}
}
}
package generic;
import java.util.LinkedList;
import property.Item;
public class ItemStack {
LinkedList<Item> Items = new LinkedList<Item>();
public void push(Item h) {
Items.addLast(h);
}
public Item pull() {
return Items.removeLast();
}
public Item peek() {
return Items.getLast();
}
public static void main(String[] args) {
ItemStack ItemStack = new ItemStack();
for (int i = 0; i < 5; i++) {
Item item = new Item("Item name " + i);
System.out.println("压入 Item:" + item);
ItemStack.push(item);
}
for (int i = 0; i < 5; i++) {
Item item =ItemStack.pull();
System.out.println("弹出 Item" + item);
}
}
}
设计一个支持泛型的栈MyStack
设计这个类的时候,在类的声明上,加上一个<T>,表示该类支持泛型。 T是type的缩写,也可以使用任何其他的合法的变量,比如A,B,X都可以,但是一般约定成俗使用T,代表类型。 package generic;
import java.util.HashMap;
import java.util.LinkedList;
import charactor.Hero;
import property.Item;
public class MyStack<T> {
LinkedList<T> values = new LinkedList<T>();
public void push(T t) {
values.addLast(t);
}
public T pull() {
return values.removeLast();
}
public T peek() {
return values.getLast();
}
public static void main(String[] args) {
//在声明这个Stack的时候,使用泛型<Hero>就表示该Stack只能放Hero
MyStack<Hero> heroStack = new MyStack<>();
heroStack.push(new Hero());
//不能放Item
heroStack.push(new Item());
//在声明这个Stack的时候,使用泛型<Item>就表示该Stack只能放Item
MyStack<Item> itemStack = new MyStack<>();
itemStack.push(new Item());
//不能放Hero
itemStack.push(new Hero());
}
}
把二叉树中的Node类,改造成支持泛型
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频
3分36秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器
但是这样的泛型有个弊端,在比较的时候,泛型T被转换为了Integer进行大小比较。换句话说,如果写成非Integer泛型,就会出现类型转换异常
new Node<Hero> 这个问题的解决,需要用到后面的 ? extends 模式 package collection;
import java.util.ArrayList;
import java.util.List;
public class Node<T> {
// 左子节点
public Node<T> leftNode;
// 右子节点
public Node<T> rightNode;
// 值
public T value;
// 插入 数据
public void add(T t) {
// 如果当前节点没有值,就把数据放在当前节点上
if (null == value)
value = t;
// 如果当前节点有值,就进行判断,新增的值与当前值的大小关系
else {
// 新增的值,比当前值小或者相同
if ((Integer) t -((Integer)value) <= 0) {
if (null == leftNode)
leftNode = new Node<T>();
leftNode.add(t);
}
// 新增的值,比当前值大
else {
if (null == rightNode)
rightNode = new Node<T>();
rightNode.add(t);
}
}
}
// 中序遍历所有的节点
public List<T> values() {
List<T> values = new ArrayList<>();
// 左节点的遍历结果
if (null != leftNode)
values.addAll(leftNode.values());
// 当前节点
values.add(value);
// 右节点的遍历结果
if (null != rightNode)
values.addAll(rightNode.values());
return values;
}
public static void main(String[] args) {
int randoms[] = new int[] { 67, 7, 30, 73, 10, 0, 78, 81, 10, 74 };
Node<Integer> roots = new Node<>();
for (int number : randoms) {
roots.add(number);
}
System.out.println(roots.values());
}
}
HOW2J公众号,关注后实时获知最新的教程和优惠活动,谢谢。
问答区域
2022-06-15
答案
回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
2021-11-24
支持二叉树的泛型
1 个答案
hoolich 跳转到问题位置 答案时间:2022-04-18 package collection;
import java.util.ArrayList;
import java.util.List;
public class Node<T> {
// 左子节点
public Node<T> leftNode;
// 右子节点
public Node<T> rightNode;
// 值
public T value;
// 插入 数据
public void add(T t) {
// 如果当前节点没有值,就把数据放在当前节点上
if (null == value)
value = t;
// 如果当前节点有值,就进行判断,新增的值与当前值的大小关系
else {
// 新增的值,比当前值小或者相同
if ((Integer) t -((Integer)value) <= 0) {
if (null == leftNode)
leftNode = new Node<T>();
leftNode.add(t);
}
// 新增的值,比当前值大
else {
if (null == rightNode)
rightNode = new Node<T>();
rightNode.add(t);
}
}
}
// 中序遍历所有的节点
public List<T> values() {
List<T> values = new ArrayList<>();
// 左节点的遍历结果
if (null != leftNode)
values.addAll(leftNode.values());
// 当前节点
values.add(value);
// 右节点的遍历结果
if (null != rightNode)
values.addAll(rightNode.values());
return values;
}
public static void main(String[] args) {
int randoms[] = new int[] { 67, 7, 30, 73, 10, 0, 78, 81, 10, 74 };
Node<Integer> roots = new Node<>();
for (int number : randoms) {
roots.add(number);
}
System.out.println(roots.values());
}
}
回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
2020-03-05
今天无意看到一个方法,不怎么能看懂.希望大佬指点.
2020-02-24
练习-支持泛型的二叉树
2019-11-11
java泛型不知道怎么约束,用C#写了一个,欢迎指教
提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 7 条以前的提问,请 点击查看
提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
|