图的适配器

本文介绍了图的基本概念,区分有向图和无向图,探讨了图的表示方法如邻接表和邻接矩阵,并通过Java代码展示了如何使用Node和Edge类创建和操作图,包括使用HashMap和HashSet存储节点和边,以及如何统一图的结构以便于编程处理。
摘要由CSDN通过智能技术生成

什么是图
图是一个由点的集合和边的集合所构成的数据结构。
图分为有向图和无向图。其中无向图也可以理解为有向图,所以可以认为所有的图都是有向图。
比方说,有这么一张图。其中a指向bc,b指向c,c指向p。边是带方向的,所以这是一个有向图。
在这里插入图片描述
而无向图呢? a连b,b连c,c连a。完全可以理解为ab互相指向,bc互相指向,ca互相指向,所以无向图也可以理解为都是有向图。
在这里插入图片描述

而图的表达方式有很多,其中常见的有邻接表法,邻接矩阵法等等。图的算法不难,难的是图的数据结构的表达。
比如说,给定一个n * 3的二维数组,[1 , 3 , 5],[0 , 5 , 5 ],[2 , 6 , 5]其中[i][0]代表的是边的权重,[i][1],[i][2]代表的是边从哪到哪。给的是每条边的权重以及从哪到哪,根据每条边画出来的图是这样的。这也是一种图的表示。
在这里插入图片描述
甚至更可以用1维数组表示一张图,所以用不同的方式表达图,所用到的解法也不同,每一种coding都要练习,那是不是可以将结构进行统一?无论什么样的图,都转换成自己的结构,将抽象化的图通过代码变得具象化,面向对象编程的思想更多一些。

代码
通过代码将点进行转化,Node对象中封装了这个点的所有基本信息,点的值,连接到这个点上的边有多少,从这个点出去的边有多少。

/*
* 点的描述
* */
public class Node {
    //点本身value
    public int value;
    //入度(有多少个点的边直接指向该点)
    public int in;
    //出度(从自己出发,直接指向别人的)
    public int out;
    //从自己出发能找到的边
    public ArrayList<Edge> edges;
    //从自己出发能找到的点
    public ArrayList<Node> nexts;

    public Node(int val){
        this.value = val;
        this.in = 0;
        this.out = 0;
        edges = new ArrayList<>();
        nexts = new ArrayList<>();
    }
}

边的描述信息,包含边的权重,从哪个点连接到哪个点。

/*
* 边的描述信息
* */
public class Edge {
    //边的权重
    public int weight;
    //从哪个点出来
    public Node from;
    //连接到哪个点
    public Node to;

    public Edge(int weight,Node from,Node to){
        this.weight = weight;
        this.from = from;
        this.to = to;
    }
}

一个图是由多个点和边所组成,所以包含了所有的点信息和边的信息,其中HashMap是具体的点的值和封装的点的对象。

/*
* 图的描述,包含了所有的点和所有的边
* */
public class Graph {

    public HashMap<Integer,Node> nodes;
    public HashSet<Edge> edges;

    public Graph(){
        nodes = new HashMap<>();
        edges = new HashSet<>();
    }
}

生成图代码
以图形式为二维数组为例,[i][0]位置是边的权重,[i][1],[i][2]是从哪个点连到哪个点。

public class GraphGenerator {

    public static Graph createGraph(int[][] matrix) {
        Graph graph = new Graph();

        for (int i = 0; i < matrix.length; i++) {
            int weight = matrix[i][0];
            int from = matrix[i][1];
            int to = matrix[i][2];

            if (!graph.nodes.containsKey(from)){
                graph.nodes.put(from,new Node(from));
            }
            if (!graph.nodes.containsKey(to)){
                graph.nodes.put(to,new Node(to));
            }
            Node fromNode = graph.nodes.get(from);
            Node toNode = graph.nodes.get(to);
            Edge edge = new Edge(weight,fromNode,toNode);

            fromNode.nexts.add(toNode);
            fromNode.out++;
            toNode.in++;
            fromNode.edges.add(edge);
            graph.edges.add(edge);
        }
        return graph;
    }
}
在 Android 中,适配器通常用于在列表视、网格视或翻页视等容器中显示片。适配器负责将片数据绑定到每个视中,以便正确显示片。 以下是一个简单的适配器示例: ```java public class ImageAdapter extends BaseAdapter { private Context mContext; private int[] mImageIds; public ImageAdapter(Context context, int[] imageIds) { mContext = context; mImageIds = imageIds; } public int getCount() { return mImageIds.length; } public Object getItem(int position) { return null; } public long getItemId(int position) { return 0; } public View getView(int position, View convertView, ViewGroup parent) { ImageView imageView; if (convertView == null) { // 如果没有可重用的视,则创建一个新的ImageView imageView = new ImageView(mContext); imageView.setLayoutParams(new GridView.LayoutParams(100, 100)); imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); } else { // 如果有可重用的视,则使用它 imageView = (ImageView) convertView; } // 加载片 imageView.setImageResource(mImageIds[position]); return imageView; } } ``` 在上面的示例中,`ImageAdapter` 继承自 `BaseAdapter` 类,该类是 Android 中适配器的基类。在构造函数中,传入了一个 `Context` 对象和一个片 ID 数组,用于初始化适配器。`getCount` 方法返回片 ID 数组的长度,`getItem` 和 `getItemId` 方法不需要实现,因为它们不会被使用。`getView` 方法是适配器最重要的方法,用于创建或重用视,并将片数据绑定到视中。在该方法中,首先检查是否存在可重用的视,如果没有,则创建一个新的 `ImageView` 对象,并设置其布局参数和缩放类型。然后,加载并显示适当位置的片。 请注意,上面的代码中,片的大小是硬编码的。为了实现更好的片适配,应该使用 Android 提供的不同尺寸的资源文件夹来存储不同分辨率的片,例如: ``` res/drawable-mdpi/my_image.png res/drawable-hdpi/my_image.png res/drawable-xhdpi/my_image.png res/drawable-xxhdpi/my_image.png ``` 在加载片时,适配器将自动根据设备的屏幕密度选择正确的片。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值